func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long maxn = 2e5 + 50;   const long long Mod = 1e9 + 7;   struct node {     long long to, next, w;   } edge[maxn * 2];   struct Edge {     long long u, v;   } t[maxn];   long long k = 0, head[maxn];   void add(long long u, long long v) {     edge[++k].to = v;     edge[k].next = head[u];     head[u] = k;   }   long long T, p[maxn], m, n;   long long ans = 0, sz[maxn], cnt[maxn];   void dfs(long long x, long long f, long long opt) {     sz[x] = 1;     for (long long i = head[x]; i; i = edge[i].next) {       if (edge[i].to == f) continue;       dfs(edge[i].to, x, i);       sz[x] += sz[edge[i].to];     }     if (opt == 0) return;     cnt[opt] = sz[x] * (n - sz[x]);     if (cnt[opt] == 0 && opt != 0) cnt[opt] = n - 1;   }   int main() {     cin >> T;     while (T--) {       k = 0;       memset(head, 0, sizeof(head));       memset(cnt, 0, sizeof(cnt));       cin >> n;       for (long long i = 1; i <= n - 1; i++) {         long long u, v;         cin >> u >> v;         add(u, v);         add(v, u);       }       cin >> m;       for (long long i = 1; i <= m; i++) cin >> p[i];       sort(p + 1, p + 1 + m);       long long cnt1 = n - 1 - m;       if (cnt1 <= 0) cnt1 = 0;       dfs(1, 1, 0);       sort(cnt + 1, cnt + 1 + k);       while (m > n - 1) {         p[m - 1] = (p[m - 1] * p[m]) % Mod;         m--;       }       long long ans = 0, opt = 0;       for (long long i = k / 2 + 1; i <= k; i++) {         if (cnt1) {           ans = (ans + cnt[i] * 1) % Mod;           cnt1--;         } else {           ans = (ans + cnt[i] * p[++opt] % Mod) % Mod;         }       }       cout << ans << endl;     }     return 0;   }   