#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>

using namespace std;

template<typename T>
inline void read(T &x)
{
	x=0;
	T w=1;
	char c=getchar();
	while(c<'0'||c>'9') w=(c=='-'?-w:w),c=getchar();
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	x*=w;
}

const int S=100005;

#define p 1000000007

const int inv2=(p+1)/2;

int fra[S],inv[S];
int n,m;
int ex[S],ey[S];
vector<pair<int,int> > g[S];
int d[S];
int a[S];
bool fl[S];
int fat[S],siz[S],f[S],f2[S];

inline int qpow(int x,int y)
{
	int res=1;
	for(;y>0;y>>=1,x=1ll*x*x%p) res=y&1?1ll*res*x%p:res;
	return res;
}

inline void add(int &x,int y)
{
	x+=y;
	if(x>=p) x-=p;
}

void dfs1(int u,int fa)
{
	fat[u]=fa;
	siz[u]=fra[d[u]-1];
	f[u]=0;
	int ml=1ll*inv[d[u]-1]*fra[d[u]-2]%p;
	for(auto t:g[u])
	{
		int v=t.first,id=t.second;
		if(v==fa) continue;
		dfs1(v,u);
		siz[u]=1ll*siz[u]*siz[v]%p; 
		if(fl[id]) add(f[u],ml);
		else add(f[u],1ll*ml*f[v]%p);
	}
}

void dfs2(int u,int fa)
{
	int ml=1ll*inv[d[u]-1]*fra[d[u]-2]%p;
	for(auto t:g[u])
	{	
		int v=t.first,id=t.second;
		if(v==fa) continue;
		if(d[v]>1) 
		{
			int tmp=f2[u];
			add(tmp,f[u]);
			if(fl[id]) add(tmp,p-ml);
			else add(tmp,p-1ll*ml*f[v]%p);
			int mlv=1ll*inv[d[v]-1]*fra[d[v]-2]%p;
			if(fl[id]) f2[v]=mlv;
			else f2[v]=1ll*mlv*tmp%p;
		}
		else f2[v]=0;
		dfs2(v,u);
	}
}

inline void slove()
{
	read(n),read(m);
	for(int i=1;i<=n;i++) g[i].clear(),d[i]=0,fl[i]=false;
	for(int i=1;i<=n-1;i++)
	{
		read(ex[i]),read(ey[i]);
		g[ex[i]].emplace_back(ey[i],i);
		g[ey[i]].emplace_back(ex[i],i);
		d[ex[i]]++,d[ey[i]]++; 
	}
	for(int i=1;i<=m;i++) read(a[i]),fl[a[i]]=true;
	int ans=0,all=1;
	for(int i=1;i<=n;i++) all=1ll*all*fra[d[i]-1]%p;
	dfs1(1,0);
	f2[1]=0;
	dfs2(1,0);
	for(int i=1;i<=m;i++)
	{
		int x=ex[a[i]],y=ey[a[i]];
		if(fat[y]==x) swap(x,y);
		int nopx=siz[x],nopy=1ll*all*qpow(siz[x],p-2)%p;
		int hx=1ll*f[x]*nopx%p,hy=f2[y];
		add(hy,f[y]);
		int ml=1ll*inv[d[y]-1]*fra[d[y]-2]%p;
		add(hy,p-ml);
		hy=1ll*hy*nopy%p;
		add(nopx,p-hx);
		add(nopy,p-hy);
//		printf("%d %d %d %d\n",nopx,nopy,hx,hy);
		add(ans,1ll*nopx*nopy%p);
		add(ans,1ll*inv2*nopx%p*hy%p);
		add(ans,1ll*inv2*hx%p*nopy%p);
	}
	printf("%d\n",ans);
}

int main()
{
	fra[0]=1;
	for(int i=1;i<=S-3;i++) fra[i]=1ll*fra[i-1]*i%p;
	inv[S-3]=qpow(fra[S-3],p-2);
	for(int i=S-3;i>=1;i--) inv[i-1]=1ll*inv[i]*i%p;
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	int c,T;
	read(c),read(T);
	while(T-->0) slove();
	return 0;
}
