#include // #pragma GCC optimize("Ofast") // #pragma GCC optimize("unroll-loops") #define int long long #define ld long double #define vec vector #define all(m) (m).begin(), (m).end() #define forn(i,n) for(int i=0;i<(n);i++) // TIP To Run code, press or click the icon in the gutter. using namespace std; int mod = 1e9+7; vec a; bool comp(int i, int j) { return a[i] < a[j]; } vec p; int fnd(int v) { if (v==p[v]) return v; return p[v] = fnd(p[v]); } vec> g; int n; vec cnt; vec sumh; void dfs(int v) { cnt[v] = 1; sumh[v] = 0; for (int u: g[v]) { dfs(u); cnt[v] += cnt[u]; sumh[v] += sumh[u]+cnt[u]; cnt[v] %= mod; sumh[v] %= mod; } } int ans = 0; void calc(int v) { for (int u: g[v]) { ans += ((a[v]*((sumh[u]+cnt[u])%mod)%mod)*((cnt[v]-cnt[u])%mod))%mod; ans %= mod; calc(u); } } void solve() { cin>>n; a.resize(n); forn(i,n) cin>>a[i]; vec vs(n); forn(i,n) vs[i] = i; sort(all(vs), comp); vec> g1(n); forn(i,n-1) { int a,b; cin>>a>>b; a--;b--; g1[a].push_back(b); g1[b].push_back(a); } p.resize(n); forn(i,n) p[i] = i; g.resize(n); vec used(n,false); for (int v: vs) { for (int u: g1[v]) { if (used[u]) { int root = fnd(u); p[root] = v; g[v].push_back(root); } } used[v] = true; } int root = vs.back(); cnt.assign(n,0); sumh.assign(n,0); dfs(root); calc(root); cout<>tt; while (tt--) solve(); return 0; }