#include #include #include using namespace std; const int MOD = (int)1e9 + 7; template struct Edge { int src, dst; T cost; Edge(int dst, T cost) : src(-1), dst(dst), cost(cost) { } Edge(int src, int dst, T cost) : src(src), dst(dst), cost(cost) { } }; template using Edges = vector>; template using WeightedGraph = vector>; template using Matrix = vector>; template void warshall_floyd_kai(Matrix &g) { const T INF = numeric_limits::max(); for (int k = 0; k < g.size(); k++) { for (int i = 0; i < g.size(); i++) if (g[i][k] != INF) { for (int j = 0; j < g.size(); j++) if (g[k][j] != INF) { g[i][j] = max(g[i][j], min(g[i][k], g[k][j])); } } } } vector> stirling2_table(int ma) { vector> dp(ma + 1, vector(ma + 1, 0)); dp[0][0] = 1; for (int i = 1; i <= ma; i++) { for (int j = 1; j <= i; j++) { dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j] * j) % MOD; } } return dp; } int main() { int V, E; cin >> V >> E; vector w(V); for (int &wi: w) cin >> wi; Matrix mat(V, vector(V, 0)); for (int i = 0; i < V; i++) mat[i][i] = w[i]; while (E--) { int s, t; cin >> s >> t; s--, t--; mat[s][t] = min(w[s], w[t]); } warshall_floyd_kai(mat); const int MAX = 1000; auto dp = stirling2_table(MAX); vector fact(MAX + 1, 1); for (int i = 2; i <= MAX; i++) fact[i] = fact[i - 1] * i % MOD; long long ans = 0; for (int i = 0; i < V; i++) for (int j = 0; j < V; j++) { if (mat[i][j] >= w[j]) (ans += dp[w[i]][w[j]] * fact[w[j]]) %= MOD; } cout << ans << endl; return 0; }