#include <bits/stdc++.h>
using namespace std;
const long long MAXn = 2e5 + 10, MOD = 1e9 + 7;
long long n, odd[MAXn], even[MAXn], h[2], ar[MAXn], ans;
vector<int> g[MAXn];
void dfs(int a, int par, int dis) {
  h[dis % 2]++;
  for (int i = 0; i < g[a].size(); i++)
    if (g[a][i] != par) {
      dfs(g[a][i], a, dis + 1);
      even[a] += odd[g[a][i]];
      odd[a] += even[g[a][i]];
    }
  for (int i = 0; i < g[a].size(); i++)
    if (g[a][i] != par) {
      long long odd1 = odd[a] - even[g[a][i]], even1 = even[a] - odd[g[a][i]];
      ans += (((((even1 - odd1 + MOD) % MOD) * (odd[g[a][i]] + even[g[a][i]])) %
               MOD) *
              ar[a]) %
             MOD;
      ans %= MOD;
    }
  ans += ((odd[a] + even[a]) * ar[a]) % MOD;
  ans %= MOD;
  ans += (((even[a] - odd[a] + MOD) % MOD) * ar[a]) % MOD;
  ans %= MOD;
  ans += ar[a];
  ans %= MOD;
  even[a]++;
}
void dfs2(int a, int par, int dis) {
  ans += (((((even[a] - odd[a] + MOD) % MOD) * (n - even[a] - odd[a])) % MOD) *
          ar[a]) %
         MOD;
  ans %= MOD;
  long long odd1 = h[(dis + 1) % 2] - odd[a], even1 = h[(dis) % 2] - even[a];
  ans += (((((even1 - odd1 + MOD) % MOD) * (even[a] + odd[a])) % MOD) * ar[a]) %
         MOD;
  ans %= MOD;
  for (int i = 0; i < g[a].size(); i++)
    if (g[a][i] != par) dfs2(g[a][i], a, dis + 1);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> ar[i];
    ar[i] += MOD;
    ar[i] %= MOD;
  }
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  dfs(0, -1, 0);
  dfs2(0, -1, 0);
  cout << ans;
}
