#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long N = 2e5 + 5;
long long n, v[N], ans, num[N];
vector<long long> g[N];
long long dp[N][2];
void add(long long &a, long long b, long long c, long long d) {
  a += (b * c + d);
  a %= 1000000007;
  a += 1000000007;
  a %= 1000000007;
}
void dfs(long long at, long long fr = -1) {
  num[at] = 1;
  dp[at][0] = v[at];
  dp[at][1] = -v[at];
  for (long long to : g[at]) {
    if (to == fr) continue;
    dfs(to, at);
    add(dp[at][0], num[to], v[at], dp[to][1]);
    add(dp[at][1], num[to], -v[at], dp[to][0]);
    num[at] += num[to];
  }
}
void update(long long at, long long fr = -1) {
  ans = (ans + dp[at][0]) % 1000000007;
  ans = (ans + 1000000007) % 1000000007;
  for (long long to : g[at]) {
    if (to == fr) continue;
    long long pre0 = dp[at][0] - (num[to] * v[at] + dp[to][1]);
    long long pre1 = dp[at][1] - (num[to] * (-v[at]) + dp[to][0]);
    pre0 %= 1000000007, pre1 %= 1000000007;
    pre0 = (pre0 + 1000000007) % 1000000007,
    pre1 = (pre1 + 1000000007) % 1000000007;
    long long f = num[to];
    num[at] -= num[to];
    num[to] += num[at];
    add(dp[to][0], num[at], v[to], pre1);
    add(dp[to][1], num[at], -v[to], pre0);
    num[at] += f;
    update(to, at);
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (long long i = 0; i < n; i++) {
    cin >> v[i];
  }
  for (long long i = 1, u, v; i < n; i++) {
    cin >> u >> v;
    u--, v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(0);
  update(0);
  cout << ans << endl;
  return 0;
}
