#include <iostream>
using namespace std;
typedef long long ll;
inline ll read(){
//	int x;
//	scanf("%d",&x);
//	return x;
	ll x=0; int flg=0; char ch=getchar();
	while(ch<'0' || ch>'9'){if(ch=='-') flg=1; ch=getchar();}
	while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-48,ch=getchar();
	if(flg) return ~(x-1); return x;
}

inline void write(ll x){
	int s[20]; int cnt=0;
	if(x<0) putchar('-'),x=~(x-1);
	while(x) s[++cnt]=x%10,x/=10;
	if(!cnt) cnt++;
	while(cnt) putchar(s[cnt--]+'0');
	putchar(' ');
}

const int N=1e5+5,mod=1e9+7;
struct edge{
	int to,nxt;
	int id;
}e[N<<4];
int task,T;
int n,k,u,v;
int h1[N],h2[N],ecnt;
int du[N];
//int dfn[N],low[N];
int scc[N],scsz[N],sccnt;
int tag[N],vis[N];
ll ans;

class set{
	public:
		void clear(int n){for(int i=0; i<=n; i++) f[i]=i;}
		int find(int x){return f[x]==x ? x : f[x]=find(f[x]);}
		void merge(int x,int y){f[find(x)]=f[find(y)];}
		int f[N];
}S;

int mul[N];
inline ll C(int n,int m){
	return (mul[n])/max(1,mul[m]*mul[n-m]%mod)%mod;
}

void add1(int u,int v,int id){
	ecnt++;
	e[ecnt]={v,h1[u],id};
	h1[u]=ecnt;
	swap(u,v);
	ecnt++;
	e[ecnt]={v,h1[u],id};
	h1[u]=ecnt;
}
void add2(int u,int v){
	ecnt++;
	e[ecnt]={v,h2[u]};
	h2[u]=ecnt;
	swap(u,v);
	ecnt++;
	e[ecnt]={v,h2[u]};
	h2[u]=ecnt;
}

void clear(){
	for(int i=0; i<=sccnt; i++) tag[i]=0;
	S.clear(sccnt ? sccnt : N-5);
	ecnt=0,sccnt=-1,ans=1;
}

// fa=fa V     fe=fa edge    fe edge
void dfs1(int u,int fa,int fe){
//	printf("\n-------Start u=%d fa=%d fe=%d----------\n",u,fa,fe);
	if(!scc[fe]) ++sccnt,scc[fe]=sccnt,scsz[sccnt]=1;
//	if(!scc[fe]) puts("NewScc"),++sccnt,scc[fe]=sccnt,scsz[sccnt]=1;
	for(int i=h1[u]; i; i=e[i].nxt){
		int v=e[i].to,id=e[i].id;
		if(v==fa) continue;
		if(du[u]>2) scsz[scc[id]=scc[fe]]++;
//		}else printf("son v=%d, e[id=%d], scc[fe]=%d\n",v,id,scc[fe]),scsz[scc[id]=scc[fe]]++;
		dfs1(v,u,id);
	}
//	printf("\n-----------End u=%d-------------\n",u);
}

void dfs2(int u,int fa){
//	printf("%d\n",u);
	vis[u]=1;
	if(scc[u]==3){
//		printf("%d\n",mul[3]);
	}
	if(u) ans=(ans*((scsz[u]*(scsz[u]-1))/2))%mod;
	for(int i=h2[u]; i; i=e[i].nxt){
		int v=e[i].to;
		if(!vis[v]) dfs2(v,u);
	}
//	for(int i=h2[u]; i; i=e[i].nxt){
//		int v=e[i].to;
//		printf("%d->%d\n",u,v);
//	}
}

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	task=read(),T=read();
	mul[0]=1;
	for(int i=1; i<=100000; i++) mul[i]=mul[i-1]*i;
	while(T--){
		clear();
		n=read(),k=read();
		for(int i=1; i<=n-1; i++){
			u=read(),v=read();
			add1(u,v,i);
			du[u]++,du[v]++;
		}
		dfs1(1,-1,0);
//		for(int i=0; i<=n; i++) printf("%d==%d\n",i,scc[i]);
		u=0;
		while(k--){
			v=read();
			if(!tag[scc[v]]){
				add2(u,scc[v]);
				tag[scc[v]]=1;
			}
		}
		for(int u=1; u<=n-1; u++){
			for(int i=h1[u]; i; i=e[i].nxt){
				int v=e[i].to,id=e[i].id;
				if(S.find(scc[u])!=S.find(scc[v]) && scc[u]!=0 && scc[v]!=0){
					S.merge(scc[u],scc[v]);
					add2(scc[u],scc[v]);
				}
			}
		}
//		puts("---");
//		for(int u=0; u<=5; u++){
//			for(int i=h2[u]; i; i=e[i].nxt)
//				printf("%d->%d\n",u,e[i].to);
//		}
		dfs2(0,-1);
		write(ans);
	}
	return 0;
}
/*
1 1
1 2
2 3
3 4
4 5
4 6
4 7
7 8
8 9
8 10
1

*/
