#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7, P = 1e9 + 7;
struct edge {
  long long t, nxt;
} e[N << 1];
long long n, cnt, ans;
long long v[N], head[N], siz[N][2], f[N][2];
void add(long long u, long long t) {
  e[++cnt].t = t;
  e[cnt].nxt = head[u];
  head[u] = cnt;
}
void dfs(long long u, long long fa) {
  for (long long i = head[u]; i; i = e[i].nxt) {
    long long t = e[i].t;
    if (t == fa) continue;
    dfs(t, u);
    siz[u][1] += siz[t][0];
    siz[u][0] += siz[t][1];
    f[u][1] = (f[u][1] + f[t][0] + 1ll * v[u] * siz[t][0] % P + P) % P;
    f[u][0] = (f[u][0] + f[t][1] - 1ll * v[u] * siz[t][1] % P + P) % P;
  }
  for (int i = head[u]; i; i = e[i].nxt) {
    int t = e[i].t;
    if (t == fa) continue;
    if (siz[t][0])
      ans = (ans + 2ll * f[t][0] * (siz[u][1] - siz[t][0]) % P +
             siz[t][0] * (siz[u][1] - siz[t][0]) % P * v[u] % P) %
            P;
    if (siz[t][1])
      ans = (ans + 2ll * f[t][1] * (siz[u][0] - siz[t][1]) % P -
             siz[t][1] * (siz[u][0] - siz[t][1]) % P * v[u] % P) %
            P;
  }
  ans = (ans + f[u][1] * 2ll % P + v[u] + P) % P;
  siz[u][1]++;
  f[u][1] = (f[u][1] + v[u] + P) % P;
}
int main() {
  scanf("%lld", &n);
  for (long long i = 1; i <= n; i++) scanf("%lld", &v[i]);
  for (long long i = 1, u, v; i < n; i++)
    scanf("%lld%lld", &u, &v), add(u, v), add(v, u);
  dfs(1, 0);
  printf("%lld\n", ans % P);
}
