#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int N = 200005;
long long ans, odd_pairs, even_pairs, odd[2], even[2], done[N], sz[N], a[N];
vector<int> adj[N];
void calc_subsize(int node, int par) {
  sz[node] = 0;
  for (int child : adj[node]) {
    if (child != par && !done[child]) {
      calc_subsize(child, node);
      sz[node] += sz[child];
    }
  }
  sz[node]++;
}
int find_centroid(int node, int par, int conditional_size) {
  for (int child : adj[node]) {
    if (child != par && !done[child] && sz[child] > conditional_size) {
      return find_centroid(child, node, conditional_size);
    }
  }
  return node;
}
void dfs(int node, int par, int even_sum, int odd_sum, int h, int typ) {
  if (h & 1) {
    odd_sum += a[node];
    odd_sum %= mod;
    if (typ) {
      odd_pairs++;
      odd_pairs %= mod;
      odd[1] += (odd_sum + mod - even_sum) % mod;
      odd[1] %= mod;
      odd[0] += (even_sum + mod - odd_sum) % mod;
      odd[0] %= mod;
    } else {
      ans += (2LL * ((odd_sum + mod - even_sum) % mod)) % mod;
      ans %= mod;
      ans +=
          ((((odd_sum + mod - even_sum) % mod) * even_pairs) % mod + even[1]) %
          mod;
      ans %= mod;
      ans +=
          ((((odd_sum + mod - even_sum) % mod) * even_pairs) % mod + even[1]) %
          mod;
      ans %= mod;
    }
  } else {
    even_sum += a[node];
    even_sum %= mod;
    if (typ) {
      even_pairs++;
      even_pairs %= mod;
      even[1] += (even_sum + mod - odd_sum) % mod;
      even[1] %= mod;
      even[0] += (odd_sum + mod - even_sum) % mod;
      even[0] %= mod;
    } else {
      ans += ((((even_sum + mod - odd_sum) % mod) * odd_pairs) % mod + odd[1]) %
             mod;
      ans %= mod;
      ans += ((((even_sum + mod - odd_sum) % mod) * odd_pairs) % mod + odd[1]) %
             mod;
      ans %= mod;
    }
  }
  for (int child : adj[node]) {
    if (child != par && !done[child]) {
      dfs(child, node, even_sum, odd_sum, h + 1, typ);
    }
  }
}
void solve(int centroid) {
  odd[0] = odd[1] = even[0] = even[1] = odd_pairs = even_pairs = 0;
  for (int child : adj[centroid]) {
    if (!done[child]) {
      dfs(child, centroid, 0, a[centroid], 2, 0);
      dfs(child, centroid, 0, 0, 1, 1);
    }
  }
}
void centroid_decomposition(int node) {
  calc_subsize(node, 0);
  int centroid = find_centroid(node, 0, sz[node] / 2);
  solve(centroid);
  done[centroid] = 1;
  for (int child : adj[centroid]) {
    if (!done[child]) {
      centroid_decomposition(child);
    }
  }
}
int main() {
  int n, u, v;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    a[i] += mod;
    a[i] %= mod;
    ans += a[i];
    ans %= mod;
  }
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  centroid_decomposition(1);
  printf("%lld\n", ans);
  return 0;
}
