#include #include #include using namespace std; typedef long long LL; const int N = 200010, M = 2 * N, MOD = 1000000007; int n, r[N], h[N], e[M], ne[M], idx, s[N]; LL ans; void Add(int x, int y) { e[idx] = y, ne[idx] = h[x], h[x] = idx++; } void DFS(int u, int p, int ma, int id) { for (int i = h[u]; i != -1; i = ne[i]) { int v = e[i]; if (v == p) continue; if (v > ma) ++s[id]; DFS(v, u, max(ma, v), id); } } int main() { // freopen("prodigy.in", "r", stdin); // freopen("prodigy.out", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &r[i]); memset(h, -1, sizeof(h)); for (int i = 1, u, v; i <= n - 1; ++i) { scanf("%d%d", &u, &v); Add(u, v), Add(v, u); } for (int i = 1; i <= n; ++i) { s[i] = 1; DFS(i, 0, i, i); } ans = 1LL; for (int i = 1; i <= n; ++i) { ans = ans * (r[i] + s[i]) % MOD; } printf("%lld\n", ans); return 0; }