#include #define show(x) cerr << #x << " = " << x << endl using namespace std; using ll = long long; using pii = pair; using vi = vector; template ostream& operator<<(ostream& os, const vector& v) { os << "sz=" << v.size() << "\n["; for (const auto& p : v) { os << p << ","; } os << "]\n"; return os; } template ostream& operator<<(ostream& os, const pair& p) { os << "(" << p.first << "," << p.second << ")"; return os; } constexpr ll MOD = 1e9 + 7; template constexpr T INF = numeric_limits::max() / 100; struct Graph { Graph(const int n) { edge.resize(n); } void addEdge(const int from, const int to) { edge[from].push_back(to); } vector> edge; }; int main() { cin.tie(0); ios::sync_with_stdio(false); int N, M; cin >> N >> M; vector w(N); for (int i = 0; i < N; i++) { cin >> w[i]; } const int W = *max_element(w.begin(), w.end()); Graph g(N); for (int i = 0; i < M; i++) { int to, from; cin >> to >> from; to--, from--; g.addEdge(from, to); } vector> dp(W, vector(W, 0)); dp[0][0] = 1; for (int i = 1; i < W; i++) { dp[i][0] = 1; for (int j = 1; j <= i; j++) { dp[i][j] = ((j + 1) * ((dp[i - 1][j] + dp[i - 1][j - 1]) % MOD)) % MOD; } } ll sum = 0; for (int i = 0; i < N; i++) { const int weight = w[i]; vector used(N, false); queue q; q.push(i); used[i] = true; sum += dp[w[i] - 1][w[i] - 1]; sum %= MOD; while (not q.empty()) { const int s = q.front(); q.pop(); for (const int to : g.edge[s]) { if ((not used[to]) and w[to] >= weight) { used[to] = true; q.push(to); sum += dp[w[to] - 1][w[i] - 1]; sum %= MOD; } } } } cout << sum << endl; return 0; }