#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
	int x=0,t=0;
	char c=getchar();
	while(c<'0'||c>'9') t|=c=='-',c=getchar();
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return t?-x:x;
}
inline void putc(char c){
	putchar(c);
}
inline void write(int x){
	if(x<0) putc('-'),x=-x;
	if(x>9) write(x/10);
	putc('0'+x%10);
}
inline char getc(){
	char c=getchar();
	while(c<'0'||c>'1') c=getchar();
	return c;
}
#define pii pair<int,int>
#define mpr make_pair
#define fir first
#define sec second
const int N=1e5+10,mod=1e9+7;
inline int add(int x,int y){ return x+y>=mod?x+y-mod:x+y; }
inline int dec(int x,int y){ return x>=y?x-y:x-y+mod; }
inline void inc(int &x,int y){ x=add(x,y); }
inline int qpow(int x,int y){
	int res=1;
	while(y){
		if(y&1) res=1ll*res*x%mod;
		x=1ll*x*x%mod;
		y>>=1;
	}
	return res;
}
int n,k,siz[N],fac[N],ans;
bool vis[N];
vector<pii>a[N];
inline void add(int u,int v,int w){
	a[u].push_back(mpr(v,w));
}
inline void Prefix(int n){
	fac[0]=1;
	for(int i=1;i<=n;i++)
		fac[i]=1ll*fac[i-1]*i%mod;
}
inline void dfs(int x,int fa){
	siz[x]=0;
	int c=0,d=a[x].size();
	for(auto tp:a[x]){
		int t=tp.fir,id=tp.sec;
		if(t==fa) continue;
		dfs(t,x),siz[x]+=siz[t];
		if(vis[id]) siz[x]++;
		if(vis[id]||siz[t]) c++;
	}
	if(siz[x]!=k) c++;
	if(d==1) return ;
	ans=1ll*ans*add(1ll*c*(c-1)/2%mod,1ll*c*(d-c)%mod)%mod*fac[d-2]%mod;
}
int main(){
//	system("fc traverse1.out traverse1.ans /n");
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	read(),Prefix(N-10);
	int T=read();
	while(T--){
		n=read(),k=read();
		for(int i=1;i<n;i++){
			int u=read(),v=read();
			add(u,v,i),add(v,u,i),vis[i]=0;
		}
		for(int i=1;i<=k;i++)
			vis[read()]=1;
		ans=1;
		dfs(1,1);
		write(ans),putc('\n');
		for(int i=1;i<=n;i++)
			a[i].clear();
	}
}
/*
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
	int x=0,t=0;
	char c=getchar();
	while(c<'0'||c>'9') t|=c=='-',c=getchar();
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return t?-x:x;
}
inline void putc(char c){
	putchar(c);
}
inline void write(int x){
	if(x<0) putc('-'),x=-x;
	if(x>9) write(x/10);
	putc('0'+x%10);
}
inline char getc(){
	char c=getchar();
	while(c<'0'||c>'1') c=getchar();
	return c;
}
#define pii pair<int,int>
#define mpr make_pair
#define fir first
#define sec second
const int N=1e5+10,mod=1e9+7,inv2=mod+1>>1;
inline int add(int x,int y){ return x+y>=mod?x+y-mod:x+y; }
inline int dec(int x,int y){ return x>=y?x-y:x-y+mod; }
inline void inc(int &x,int y){ x=add(x,y); }
inline int qpow(int x,int y){
	int res=1;
	while(y){
		if(y&1) res=1ll*res*x%mod;
		x=1ll*x*x%mod;
		y>>=1;
	}
	return res;
}
int n,k,siz[N],fac[N],f[N][2][2][2],sf[N],g[N],dt[N],d0[N],d1[N];
bool vis[N];
vector<pii>a[N];
inline void add(int u,int v,int w){
	a[u].push_back(mpr(v,w));
}
inline void Prefix(int n){
	fac[0]=1;
	for(int i=1;i<=n;i++)
		fac[i]=1ll*fac[i-1]*i%mod;
}
int t[3][2][2],nt[3][2][2];
inline void dfs(int x,int fa){
	if(x!=fa&&a[x].size()==1){
		f[x][0][0][1]=g[x]=1;
		return ;
	}
	for(auto tp:a[x]){
		int t=tp.fir,id=tp.sec;
		if(t==fa) continue;
		dfs(t,x);
	}
	for(int a=0;a<=2;a++)
		for(int b=0;b<=1;b++)
			for(int c=0;c<=1;c++)
				t[a][b][c]=0;
	t[0][0][1]=1;
	int d=0;
	for(auto tp:a[x]){
		int t=tp.fir,id=tp.sec;
		if(t==fa) continue;
		d++;
		for(int a=0;a<=2;a++)
			for(int b=0;b<=1;b++){
				for(int f=0;f<=1;f++){
					int w=t[a][b][f];
					for(int c=0;c<=1;c++)
						for(int d=0;d<=1;d++)
							for(int e=0;e<=1;e++){
								int w2=f[t][c][d][e];
								if(!w2) continue;
								int wt=1ll*w*w2%mod;
								if(d) wt=1ll*wt*(dt[t]-1)%mod;
								inc(nt[a][b][f],wt);
								if(a==2) continue;
								int na=a+1,nb=b||vis[id]||c,nf=f&&e;
								inc(nt[na][nb][nf],wt);
							}
				}
				
			}
		for(int a=0;a<=2;a++)
			for(int b=0;b<=1;b++)
				for(int c=0;c<=1;c++)
					t[a][b][c]=nt[a][b][c],nt[a][b][c]=0;
	}
	for(int a=0;a<=2;a++)
		for(int b=0;b<=1;b++)
			for(int c=0;c<=1;c++){
				
			}
	s=1ll*dec(s,st)*inv2%mod;
	g[x]=1ll*g[x]*fac[d]%mod*inv2%mod;
//	printf("%d %d %d\n",x,f[x],g[x]);
}
int main(){
//	system("fc traverse4.out traverse4.ans /n");
	freopen("traverse2.in","r",stdin);
//	freopen("traverse4.out","w",stdout);
	read(),Prefix(N-10);
	int T=read();
	while(T--){
		n=read(),k=read();
		for(int i=1;i<n;i++){
			int u=read(),v=read();
			add(u,v,i),add(v,u,i),vis[i]=0;
		}
		for(int i=1;i<=k;i++)
			vis[read()]=1;
		if(n==2){
			write(1),putc('\n');
			for(int i=1;i<=n;i++)
				a[i].clear();
			continue;
		}
		int rt=0;
		for(int i=1;i<=n;i++)
			if(a[i].size()>=2)
				rt=i;
		dfs(rt,rt);
//		int ct=1;
//		for(int i=1;i<=n;i++)
//			ct+=a[i].size()>1;
		write(f[1]),putc('\n');
		for(int i=1;i<=n;i++)
			a[i].clear();
	}
}
*/
