#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 1000000007;
const ll INF = (ll)1e18;
const int MX = 1000001;
ll modExp(ll base, ll power) {
if (power == 0) return 1;
ll cur = modExp(base, power/2);
cur = (cur * cur) % MOD;
if (power & 1) cur = (cur * base) % MOD;
return cur;
}
ll inv(ll x) { return modExp(x, MOD-2); }
ll mul(ll A, ll B) { return (A*B) % MOD; }
ll add(ll A, ll B) { A += B; if (A >= MOD) A -= MOD; return A; }
ll sub(ll A, ll B) { A -= B; if (A < 0) A += MOD; return A; }
const int MAXN = 200005;
int n;
vector<int> adj[MAXN];
ll arr[MAXN];
ll dp[MAXN];
ll neg[MAXN], negsum[MAXN];
ll pos[MAXN], possum[MAXN];
void dfs1(int u, int p) {
pos[u]++;
possum[u] += arr[u];
for (int v : adj[u]) {
if (v == p) continue;
dfs1(v, u);
pos[u] += neg[v];
neg[u] += pos[v];
possum[u] += negsum[v];
negsum[u] += possum[v];
}
possum[u] += pos[u] * arr[u];
negsum[u] += neg[u] * arr[u];
}
void dfs2(int u, int p) {
// b was undefined – guessing you meant to combine both sums here:
dp[u] = add(possum[u] % MOD, negsum[u] % MOD);
for (int v : adj[u]) {
if (v == p) continue;
ll newpossum = sub(possum[u], negsum[v]);
ll newnegsum = sub(negsum[u], possum[v]);
ll newneg = sub(neg[u], pos[v]);
ll newpos = sub(pos[u], neg[v]);
possum[v] = add(possum[v], newnegsum);
negsum[v] = add(negsum[v], newpossum);
neg[v] = add(neg[v], newpos);
pos[v] = add(pos[v], newneg);
dfs2(v, u);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
for (int i = 0; i < n-1; i++) {
int u,v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs1(1, 0);
dfs2(1, 0);
ll res = 0;
for (int i = 1; i <= n; i++) {
res = add(res, dp[i]);
}
cout << res << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKY29uc3QgaW50IE1PRCA9IDEwMDAwMDAwMDc7CmNvbnN0IGxsIElORiA9IChsbCkxZTE4Owpjb25zdCBpbnQgTVggPSAxMDAwMDAxOwoKbGwgbW9kRXhwKGxsIGJhc2UsIGxsIHBvd2VyKSB7CiAgICBpZiAocG93ZXIgPT0gMCkgcmV0dXJuIDE7CiAgICBsbCBjdXIgPSBtb2RFeHAoYmFzZSwgcG93ZXIvMik7CiAgICBjdXIgPSAoY3VyICogY3VyKSAlIE1PRDsKICAgIGlmIChwb3dlciAmIDEpIGN1ciA9IChjdXIgKiBiYXNlKSAlIE1PRDsKICAgIHJldHVybiBjdXI7Cn0KCmxsIGludihsbCB4KSB7IHJldHVybiBtb2RFeHAoeCwgTU9ELTIpOyB9CmxsIG11bChsbCBBLCBsbCBCKSB7IHJldHVybiAoQSpCKSAlIE1PRDsgfQpsbCBhZGQobGwgQSwgbGwgQikgeyBBICs9IEI7IGlmIChBID49IE1PRCkgQSAtPSBNT0Q7IHJldHVybiBBOyB9CmxsIHN1YihsbCBBLCBsbCBCKSB7IEEgLT0gQjsgaWYgKEEgPCAwKSBBICs9IE1PRDsgcmV0dXJuIEE7IH0KCmNvbnN0IGludCBNQVhOID0gMjAwMDA1OwppbnQgbjsKdmVjdG9yPGludD4gYWRqW01BWE5dOwpsbCBhcnJbTUFYTl07CgpsbCBkcFtNQVhOXTsKbGwgbmVnW01BWE5dLCBuZWdzdW1bTUFYTl07CmxsIHBvc1tNQVhOXSwgcG9zc3VtW01BWE5dOwoKdm9pZCBkZnMxKGludCB1LCBpbnQgcCkgewogICAgcG9zW3VdKys7CiAgICBwb3NzdW1bdV0gKz0gYXJyW3VdOwogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHApIGNvbnRpbnVlOwogICAgICAgIGRmczEodiwgdSk7CiAgICAgICAgcG9zW3VdICAgICs9IG5lZ1t2XTsKICAgICAgICBuZWdbdV0gICAgKz0gcG9zW3ZdOwogICAgICAgIHBvc3N1bVt1XSArPSBuZWdzdW1bdl07CiAgICAgICAgbmVnc3VtW3VdICs9IHBvc3N1bVt2XTsKICAgIH0KICAgIHBvc3N1bVt1XSAgKz0gcG9zW3VdICogYXJyW3VdOwogICAgbmVnc3VtW3VdICArPSBuZWdbdV0gKiBhcnJbdV07Cn0KCnZvaWQgZGZzMihpbnQgdSwgaW50IHApIHsKICAgIC8vIGIgd2FzIHVuZGVmaW5lZCDigJMgZ3Vlc3NpbmcgeW91IG1lYW50IHRvIGNvbWJpbmUgYm90aCBzdW1zIGhlcmU6CiAgICBkcFt1XSA9IGFkZChwb3NzdW1bdV0gJSBNT0QsIG5lZ3N1bVt1XSAlIE1PRCk7CgogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHApIGNvbnRpbnVlOwogICAgICAgIGxsIG5ld3Bvc3N1bSA9IHN1Yihwb3NzdW1bdV0sIG5lZ3N1bVt2XSk7CiAgICAgICAgbGwgbmV3bmVnc3VtID0gc3ViKG5lZ3N1bVt1XSwgcG9zc3VtW3ZdKTsKICAgICAgICBsbCBuZXduZWcgICAgPSBzdWIobmVnW3VdLCBwb3Nbdl0pOwogICAgICAgIGxsIG5ld3BvcyAgICA9IHN1Yihwb3NbdV0sIG5lZ1t2XSk7CiAgICAgICAgcG9zc3VtW3ZdICAgID0gYWRkKHBvc3N1bVt2XSwgbmV3bmVnc3VtKTsKICAgICAgICBuZWdzdW1bdl0gICAgPSBhZGQobmVnc3VtW3ZdLCBuZXdwb3NzdW0pOwogICAgICAgIG5lZ1t2XSAgICAgICA9IGFkZChuZWdbdl0sIG5ld3Bvcyk7CiAgICAgICAgcG9zW3ZdICAgICAgID0gYWRkKHBvc1t2XSwgbmV3bmVnKTsKICAgICAgICBkZnMyKHYsIHUpOwogICAgfQp9CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4gPj4gbjsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGNpbiA+PiBhcnJbaV07CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4tMTsgaSsrKSB7CiAgICAgICAgaW50IHUsdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KCiAgICBkZnMxKDEsIDApOwogICAgZGZzMigxLCAwKTsKCiAgICBsbCByZXMgPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgcmVzID0gYWRkKHJlcywgZHBbaV0pOwogICAgfQogICAgY291dCA8PCByZXMgPDwgIlxuIjsKICAgIHJldHVybiAwOwp9Cg==