#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7, maxn = 201, maxm = 11, maxmask = 1 << 11;
int n, m, s, dm[maxm][maxn], ds[maxm] = {0}, did[maxn][maxm] = {0};
bool dl[maxn][maxn] = {false};
long long** T[maxm][maxm];
long long** tsp[maxmask][maxm];
long long cw[maxmask] = {0}, dp[maxmask] = {0};
void ngat(long long** mat, int r)
{
if (!mat) return;
for (int i = 0; i < r; ++i) delete[] mat[i];
delete[] mat;
}
long long** mul(long long** a, int r1, int c1, long long** b, int r2, int c2)
{
if (!a || !b || c1 != r2) return nullptr;
long long** res = new long long*[r1];
for (int i = 0; i < r1; ++i) res[i] = new long long[c2]();
for (int i = 0; i < r1; ++i)
{
for (int j = 0; j < c2; ++j)
{
for (int k = 0; k < c1; ++k)
{
res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod;
}
}
}
return res;
}
void add(long long**& a, int r, int c, long long** b)
{
if (!b) return;
if (!a)
{
a = b;
return;
}
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
a[i][j] = (a[i][j] + b[i][j]) % mod;
}
}
ngat(b, r);
}
long long trace(long long** mat, int sz)
{
if (!mat) return 0;
long long t = 0;
for (int i = 0; i < sz; ++i) t = (t + mat[i][i]) % mod;
return t;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if(fopen("company.inp","r"))
{
freopen("company.inp","r",stdin);
freopen("company.out","w",stdout);
}
cin >> n >> m >> s;
for (int i = 0; i < n; ++i)
{
int d;
cin >> d;
--d;
dm[d][ds[d]++] = i;
}
for (int k = 0; k < s; ++k)
{
int u, v;
cin >> u >> v;
--u;
--v;
dl[u][v] = true;
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
for (int k = 0; k < ds[j]; ++k)
{
if (dl[i][dm[j][k]]) did[i][j]++;
}
}
}
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < m; ++j)
{
if (i == j || ds[i] == 0 || ds[j] < 2) continue;
int si = ds[i], sj = ds[j];
T[i][j] = new long long*[si];
for(int k=0; k<si; ++k) T[i][j][k] = new long long[sj]();
int th = (sj - 1) / 2;
for (int ui = 0; ui < si; ++ui)
{
int u = dm[i][ui];
for (int vi = 0; vi < sj; ++vi)
{
int v = dm[j][vi];
if (did[u][j] - dl[u][v] <= th)
{
T[i][j][ui][vi] = 1;
}
}
}
}
}
for(int i = 0; i < m; ++i)
{
int sz = ds[i];
if (sz > 0)
{
tsp[1 << i][i] = new long long*[sz];
for(int k=0; k<sz; ++k)
{
tsp[1 << i][i][k] = new long long[sz]();
tsp[1 << i][i][k][k] = 1;
}
}
}
for (int mask = 1; mask < (1 << m); ++mask)
for (int j = 0; j < m; ++j)
{
if (!((mask >> j) & 1) || !tsp[mask][j]) continue;
for (int k = 0; k < m; ++k)
{
if ((mask >> k) & 1) continue;
long long** res = mul(tsp[mask][j], ds[__builtin_ctz(mask)], ds[j], T[j][k], ds[j], ds[k]);
if(res) add(tsp[mask | (1 << k)][k], ds[__builtin_ctz(mask)], ds[k], res);
}
}
for (int mask = 1; mask < (1 << m); ++mask)
{
if (__builtin_popcount(mask) < 2) continue;
int st = __builtin_ctz(mask);
for (int en = 0; en < m; ++en)
{
if (st != en && ((mask >> en) & 1))
{
long long** res = mul(tsp[mask][en], ds[st], ds[en], T[en][st], ds[en], ds[st]);
if (res)
{
cw[mask] = (cw[mask] + trace(res, ds[st])) % mod;
ngat(res, ds[st]);
}
}
}
}
dp[0] = 1;
for (int mask = 1; mask < (1 << m); ++mask)
{
int st = __builtin_ctz(mask);
for (int sub = mask ^ (1 << st); ; sub = (sub - 1) & (mask ^ (1 << st)))
{
int cm = sub | (1 << st);
dp[mask] = (dp[mask] + cw[cm] * dp[mask ^ cm]) % mod;
if (sub == 0) break;
}
}
cout << dp[(1 << m) - 1] << endl;
for (int i = 0; i < m; ++i)
for (int j = 0; j < m; ++j)
ngat(T[i][j], ds[i]);
for (int i = 0; i < (1 << m); ++i)
for (int j = 0; j < m; ++j)
if(tsp[i][j]) ngat(tsp[i][j], ds[__builtin_ctz(i)]);
return 0;
}