#include using namespace std; #define rep(i, a, b) for(int i=a;i<(b);++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; ll M = 1e9+7; ll comb(ll num, ll div){ ll res = 1; for(int i = 0; i> &graph, vector&vis, int v){ if(vis[v]) return; vis[v] = true; for(auto edge: graph[v]){ dfs(graph, vis, edge); } } ll sub(int a, int b){ return (a+M-b)%M; } ll add(int a, int b){ return (a+b)%M; } ll mult(int a, int b){ return (a*b+M)%M; } ll pow(int a, int b){ int res = 1; rep(i,0,b) res = mult(res, a); return res; } int main(){ cin.tie(0)->sync_with_stdio(0); cout.tie(0); int n, m, t;cin>>n>>m>>t; vector arr(t); rep(i,0, t){ cin>>arr[i]; } vector edges; rep(i,0, m){ int u;int v;cin>>u>>v; edges.push_back({u, v}); } vector totals(22); rep(bits, 0, 1<> graph(n); int ones = 0; rep(i,0,m){ if(bits&(1< vis(n); int comp=0; for(int i = 0; i powers(1e6); powers[0] = 1; rep(q, 0, t){ ll res = 1; rep(i, 0, 21){ res = mult(res, arr[i]); } for(int i = 1; i<=21; i++){ if(arr[i]>=i){ res = sub(res, mult(totals[i], comb(arr[i], i))); } } cout<