#include <bits/stdc++.h>
using namespace std;
vector<int> vec[2 * (int)1e5 + 5];
long long V[2 * (int)1e5 + 5], node[2 * (int)1e5 + 5][2], cnt[2 + 5];
void color(int u, int par, int c) {
  ++cnt[c];
  for (int i = 0; i < vec[u].size(); i++) {
    if (vec[u][i] != par) {
      color(vec[u][i], u, c ^ 1);
    }
  }
}
long long ans = 0;
const long long mod = (long long)1e9 + 7;
void calc(int u, int par, int c) {
  ++node[u][c];
  for (int i = 0; i < vec[u].size(); i++) {
    if (vec[u][i] != par) {
      calc(vec[u][i], u, c ^ 1);
      long long sameRet = node[vec[u][i]][c];
      long long oppoRet = node[vec[u][i]][c ^ 1];
      ans += (((((sameRet * node[u][c]) % mod) * 2LL) % mod) * V[u]) % mod;
      ans %= mod;
      ans -= (((((oppoRet * node[u][c ^ 1]) % mod) * 2LL) % mod) * V[u]) % mod;
      ans += mod;
      ans %= mod;
      node[u][c] += sameRet;
      node[u][c ^ 1] += oppoRet;
    }
  }
  long long remSame = cnt[c] - node[u][c];
  ans += (((((remSame * node[u][c]) % mod) * 2LL) % mod) * V[u]) % mod;
  ans %= mod;
  long long remOppo = cnt[c ^ 1] - node[u][c ^ 1];
  ans -= (((((remOppo * node[u][c ^ 1]) % mod) * 2LL) % mod) * V[u]) % mod;
  ans += mod;
  ans %= mod;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &V[i]);
    ans += V[i];
    ans %= mod;
  }
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d %d", &u, &v);
    vec[u].push_back(v);
    vec[v].push_back(u);
  }
  color(1, -1, 0);
  calc(1, -1, 0);
  printf("%lld\n", ans);
  return 0;
}
