#include <bits/stdc++.h>
#define ll long long
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define maxn 210000
using namespace std;
const int MOD = 1e9 + 7;
ll n, val[maxn], rank_val[maxn], child[maxn], B_array[maxn];
bool banned[maxn];
vector<int> adj[maxn];
ll sum_tree[maxn + 7], cnt_tree[maxn + 7];
int ma_rank = 0;
// --- BIT LOGIC ---
void update_bit(int i, ll v, ll c) {
v = (v % MOD + MOD) % MOD;
c = (c % MOD + MOD) % MOD;
for (; i <= n; i += i & -i) {
sum_tree[i] = (sum_tree[i] + v) % MOD;
cnt_tree[i] = (cnt_tree[i] + c) % MOD;
}
}
ll query_sum(int i) {
ll res = 0;
for (; i > 0; i -= i & -i) res = (res + sum_tree[i]) % MOD;
return res;
}
ll query_cnt(int i) {
ll res = 0;
for (; i > 0; i -= i & -i) res = (res + cnt_tree[i]) % MOD;
return res;
}
// --- CENTROID TEMPLATE ---
void countChild(int u, int p) {
child[u] = 1;
for (int v : adj[u]) {
if (v == p || banned[v]) continue;
countChild(v, u);
child[u] += child[v];
}
}
int find_centroid(int u, int p, int sz_total) {
for (int v : adj[u]) {
if (v != p && !banned[v] && child[v] > sz_total / 2)
return find_centroid(v, u, sz_total);
}
return u;
}
// --- LOGIC BÀI 1 ---
void dfs_B(int u, int p, ll current_B, vector<int>& list_v) {
B_array[u] = current_B;
list_v.push_back(u);
update_bit(rank_val[u], val[u], 1);
for (int v : adj[u]) {
if (v != p && !banned[v]) {
ll count = query_cnt(rank_val[v]);
ll sum_gt = (query_sum(n) - query_sum(rank_val[v]) + MOD) % MOD;
ll cross = (val[v] % MOD * count % MOD + sum_gt) % MOD;
ll next_B = (current_B + cross + val[v] % MOD) % MOD;
dfs_B(v, u, next_B, list_v);
}
}
update_bit(rank_val[u], -val[u], -1); // Rollback BIT
}
ll calc_F(vector<int>& S) {
sort(S.begin(), S.end(), [](int a, int b) { return val[a] < val[b]; });
ll F = 0, SumSz = 0;
for (int x : S) {
ll s_x = child[x] % MOD;
ll v_x = val[x] % MOD;
F = (F + 2LL * v_x % MOD * s_x % MOD * SumSz % MOD + v_x * s_x % MOD * s_x % MOD) % MOD;
SumSz = (SumSz + s_x) % MOD;
}
return F;
}
ll Total_Ans = 0;
void process_centroid(int C) {
countChild(C, 0); // Cập nhật lại child size trong cây con hiện tại
int N_C = child[C];
ll sum_pairs = 0, part1 = 0, F_sub = 0;
vector<int> all_v;
update_bit(rank_val[C], val[C], 1);
for (int v : adj[C]) {
if (!banned[v]) {
vector<int> cur_list;
ll count = query_cnt(rank_val[v]);
ll sum_gt = (query_sum(n) - query_sum(rank_val[v]) + MOD) % MOD;
ll cross = (val[v] % MOD * count % MOD + sum_gt) % MOD;
ll next_B = (val[C] % MOD + cross + val[v] % MOD) % MOD;
dfs_B(v, C, next_B, cur_list);
ll s_v = child[v];
sum_pairs = (sum_pairs + s_v * s_v % MOD) % MOD;
for (int x : cur_list) part1 = (part1 + B_array[x] % MOD * (N_C - s_v) % MOD) % MOD;
F_sub = (F_sub + calc_F(cur_list)) % MOD;
all_v.insert(all_v.end(), cur_list.begin(), cur_list.end());
}
}
update_bit(rank_val[C], -val[C], -1); // Reset BIT hoàn toàn
sum_pairs = (1LL * (N_C - 1) * (N_C - 1) % MOD - sum_pairs + MOD) % MOD * 500000004 % MOD;
part1 = (part1 + val[C] % MOD * (1 - sum_pairs % MOD + MOD) % MOD) % MOD;
ll F_total = calc_F(all_v);
ll part2 = (F_total - F_sub + MOD) % MOD * 500000004 % MOD;
Total_Ans = (Total_Ans + part1 + part2) % MOD;
}
void solve(int u) {
countChild(u, 0);
int root = find_centroid(u, 0, child[u]);
process_centroid(root);
banned[root] = 1;
for (int v : adj[root]) {
if (!banned[v]) solve(v);
}
}
int main() {
itachi
if (!(cin >> n)) return 0;
vector<long long> sorted_vals;
for (int i = 1; i <= n; i++) {
cin >> val[i];
sorted_vals.push_back(val[i]);
}
sort(sorted_vals.begin(), sorted_vals.end());
for (int i = 1; i <= n; i++) {
rank_val[i] = lower_bound(sorted_vals.begin(), sorted_vals.end(), val[i]) - sorted_vals.begin() + 1;
}
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
adj[u].push_back(v); adj[v].push_back(u);
}
solve(1);
cout << Total_Ans << "\n";
return 0;
}