#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
const long long mod = 1e9 + 7;
long long giv[maxn];
int n, nm;
long long w[2];
long long res;
struct node {
  int to, next;
} edg[maxn * 2];
int beg[maxn];
bool col[maxn];
long long num[maxn][2];
void ran(int x, bool y, int fa) {
  col[x] = y;
  w[y]++;
  for (int i = beg[x]; i != -1; i = edg[i].next) {
    if (edg[i].to == fa) continue;
    ran(edg[i].to, !y, x);
  }
}
void add(int a, int b) {
  edg[++nm].to = b;
  edg[nm].next = beg[a];
  beg[a] = nm;
}
void play(int x, int fa) {
  int i, j, a, b;
  for (i = beg[x]; i != -1; i = edg[i].next) {
    if (edg[i].to == fa) continue;
    play(edg[i].to, x);
    num[x][0] += num[edg[i].to][0];
    num[x][1] += num[edg[i].to][1];
    res += num[edg[i].to][col[x]] * (w[col[x]] - num[edg[i].to][col[x]]) % mod *
           giv[x] % mod;
    res -= num[edg[i].to][!col[x]] * (w[!col[x]] - num[edg[i].to][!col[x]]) %
           mod * giv[x] % mod;
    res = (res % mod + mod) % mod;
  }
  num[x][col[x]]++;
  res += num[x][col[x]] * (w[col[x]] - num[x][col[x]]) % mod * giv[x] % mod;
  res -= num[x][!col[x]] * (w[!col[x]] - num[x][!col[x]]) % mod * giv[x] % mod;
  res = (res % mod + mod) % mod;
}
int main() {
  memset(beg, -1, sizeof(beg));
  int i, j, a, b;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) scanf("%lld", &giv[i]);
  for (i = 1; i < n; i++) {
    scanf("%d%d", &a, &b);
    add(a, b);
    add(b, a);
  }
  ran(1, 0, 0);
  for (i = 1; i <= n; i++) {
    res += giv[i] * w[col[i]];
    res %= mod;
  }
  play(1, 0);
  printf("%lld", res);
  return 0;
}
