#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n,f[N],g[N],dis[N][2],son[N][2];
vector<int>e[N];
void dfs1(int x,int fa){
for(auto v:e[x]){
if(v==fa)continue;
dfs1(v,x);
f[x] = max(f[x],1+f[v]);
if(dis[v][0]+1>=dis[x][0]){
dis[x][1] = dis[x][0];
son[x][1] = son[x][0];
dis[x][0] = dis[v][0]+1;
son[x][0] = v;
}
else if(dis[v][0]+1>dis[x][1]){
dis[x][1] = dis[v][0]+1;
son[x][1] = v;
}
}
}
void dfs2(int x,int fa){
if(x!=1){
g[x] = 1+g[fa];
if(son[fa][0]==x){
g[x] = max(g[x],1+dis[fa][1]);
}
else{
g[x] = max(g[x],1+dis[fa][0]);
}
}
for(auto v:e[x]){
if(v==fa)continue;
dfs2(v,x);
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs1(1,0);
dfs2(1,0);
for(int i=1;i<=n;i++){
cout<<max(f[i],g[i])<<" ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
#define int long long
int n,f[N],siz[N],dis[N];
vector<int>e[N];
void dfs1(int x,int fa){
siz[x] = 1;
if(x!=1)
dis[x] = dis[fa]+1;
for(auto v:e[x]){
if(v==fa)continue;
dfs1(v,x);
siz[x]+=siz[v];
}
}
void dfs2(int x,int fa){
for(auto v:e[x]){
if(v==fa)continue;
f[v] = f[x]-siz[v]+n-siz[v];
dfs2(v,x);
}
}
signed main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs1(1,0);
for(int i=1;i<=n;i++){
f[1]+=dis[i];
}
dfs2(1,0);
for(int i=1;i<=n;i++){
cout<<f[i]<<" ";
}
return 0;
}
/*
f[i][j]距离i点为j的点有多少个
f[x][j] += f[v][j-1]
f[x][k] += f[v][m-k-1]
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e4+5;
int n,k,f[N][505],res;
vector<int>e[N];
void dfs(int x,int fa){
f[x][0] = 1;
for(auto v:e[x]){
if(v==fa)continue;
dfs(v,x);
for(int i=0;i<=k;i++){
if(k-i-1>=0)
res += f[x][i]*f[v][k-i-1];
}
for(int i=1;i<=k;i++){
f[x][i]+=f[v][i-1];
}
}
}
signed main(){
cin>>n>>k;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
cout<<res<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+5,Mod=1e9+7;
int T,n,m,a[N],siz[N],b[N];
vector<int>e[N];
void dfs(int x,int fa){
siz[x] = 1;
for(auto v:e[x]){
if(v==fa)continue;
dfs(v,x);
siz[x]+=siz[v];
a[v] = (siz[v]*(n-siz[v]));
}
}
signed main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++)e[i].clear();
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
cin>>m;
for(int i=2;i<=m+1;i++){
cin>>b[i];
}
sort(a+2,a+n+1);
if(m+1<=n){
for(int i=m+2;i<=n;i++){
b[i] = 1;
}
sort(b+2,b+n+1);
int res = 0;
for(int i=2;i<=n;i++){
res+=a[i]*b[i]%Mod;
res%=Mod;
}
cout<<res<<endl;
}
else{
sort(b+2,b+m+2);
int res = 0;
for(int i=n+1;i<=m+1;i++){
b[n]*=b[i];b[n]%=Mod;
}
for(int i=2;i<=n;i++){
res+=a[i]*b[i]%Mod;
res%=Mod;
}
cout<<res<<endl;
}
}
return 0;
}