ll t,n,m,ans;
ll p[maxn],s[maxn];
vector<ll> e[maxn];
priority_queue<ll> q;
void init(){
memset(s,0,sizeof s);
memset(p,0,sizeof p);
ans=0;
for(int i=1;i<=n;i++){
e[i].clear();
}
while(!q.empty()) q.pop();
}
void dfs(ll x,ll f){
s[x]=1;
for(int i=0;i<e[x].size();i++){
ll y=e[x][i];
if(y==f) continue;
dfs(y,x);
s[x]+=s[y];
}
}
void dfs2(ll x,ll f){
for(int i=0;i<e[x].size();i++){
ll y=e[x][i];
if(y==f) continue;
q.push(s[y]*(n-s[y]));
dfs2(y,x);
}
}
int cmp(ll a,ll b){
return a>b;
}
int main(){
int t;
cin>>t;
while(t--){
init();
scanf("%lld",&n);ll x,y;
for(int i=1;i<=n-1;i++){
scanf("%lld%lld",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
scanf("%lld",&m);
for(int i=1;i<=m;i++){
scanf("%lld",&p[i]);//质数
}
dfs(1,0);
dfs2(1,0);
sort(p+1,p+1+m,cmp);
if(m<=(n-1)){
ll top=1;
while(!q.empty()){
if(top<=m) ans+=q.top()*p[top];
else ans+=q.top();
ans%=mod;
q.pop();
top++;
}
}
else{
ll top=m-n+2;
ll sum=1;
for(int i=1;i<=(m-(n-1))+1;i++)
{
(sum*=p[i])%=mod;
}
p[top]=sum;
while(q.size())
{
(ans+=q.top()*p[top])%=mod;
q.pop();
top++;
}
}
printf("%lld\n",ans);
}
}