#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int mo = 1e9 + 7;
const int maxn = 2e5 + 5;
int val[maxn];
int head[maxn], nxt[maxn << 1], to[maxn << 1];
int edgenum = -1;
void add(int u, int v) {
  edgenum++;
  nxt[edgenum] = head[u];
  head[u] = edgenum;
  to[edgenum] = v;
}
void add_edge(int u, int v) {
  add(u, v);
  add(v, u);
}
LL dp[maxn][2];
bool which[maxn];
LL ans = 0;
void dfs1(int now, int fa) {
  dp[now][0] = 1;
  for (int i = head[now]; ~i; i = nxt[i]) {
    if (to[i] == fa) continue;
    dfs1(to[i], now);
    dp[now][0] += dp[to[i]][1];
    dp[now][0] %= mo;
    dp[now][1] += dp[to[i]][0];
    dp[now][1] %= mo;
  }
  ans = (ans + 2 * dp[now][0] * val[now] % mo) % mo;
}
void dfs2(int now, int fa) {
  for (int i = head[now]; ~i; i = nxt[i]) {
    if (to[i] == fa) continue;
    which[to[i]] = which[now] ^ 1;
    dfs2(to[i], now);
  }
}
void calin(int now, int fa) {
  LL sum0, sum1;
  bool first = 1;
  for (int i = head[now]; ~i; i = nxt[i]) {
    if (to[i] == fa) continue;
    calin(to[i], now);
    if (first) {
      sum0 = dp[to[i]][0];
      sum1 = dp[to[i]][1];
      first = 0;
    } else {
      ans = (ans + 2 * sum0 * dp[to[i]][0] % mo * (-val[now])) % mo;
      sum0 += dp[to[i]][0];
      sum0 %= mo;
      ans = (ans + 2 * sum1 * dp[to[i]][1] % mo * val[now]) % mo;
      sum1 += dp[to[i]][1];
      sum1 %= mo;
    }
  }
}
void calout(int now, int fa) {
  if (which[now] == 0) {
    ans = (ans +
           2 * (dp[1][0] - dp[now][0]) * (dp[now][0]) % mo * (val[now]) % mo) %
          mo;
    if (ans < 0) ans += mo;
    ans = (ans +
           2 * (dp[1][1] - dp[now][1]) * (dp[now][1]) % mo * (-val[now]) % mo) %
          mo;
    if (ans < 0) ans += mo;
  } else {
    ans = (ans +
           2 * (dp[1][0] - dp[now][1]) * (dp[now][1]) % mo * (-val[now]) % mo) %
          mo;
    if (ans < 0) ans += mo;
    ans = (ans +
           2 * (dp[1][1] - dp[now][0]) * (dp[now][0]) % mo * val[now] % mo) %
          mo;
    if (ans < 0) ans += mo;
  }
  for (int i = head[now]; ~i; i = nxt[i]) {
    if (to[i] == fa) continue;
    calout(to[i], now);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  int i;
  memset(head, -1, sizeof(head));
  for (i = 1; i <= n; i++) {
    scanf("%d", &val[i]);
    ans -= val[i];
  }
  int u, v;
  for (i = 1; i < n; i++) {
    scanf("%d%d", &u, &v);
    add_edge(u, v);
  }
  dfs1(1, 0);
  dfs2(1, 0);
  calin(1, 0);
  calout(1, 0);
  printf("%lld\n", ans);
  return 0;
}
