#include<cstdio>
#define ll long long
char Begin;
int read(){
	int num=0;
	char ch;ch=getchar();
	while(ch<48||ch>57)ch=getchar();
	while(ch>47&&ch<58){
		num=(num<<1)+(num<<3)+(ch^48);
		ch=getchar();
	}return num;
}
const int N=2e5+5;
const ll mod=1e9+7;
const ll mod2=5e8+4;
int n,m;
ll ans;
int em,e[N<<1],nx[N<<1],ls[N];
ll inv[N],fac[N],ifac[N];
void insert(int x,int y){
	e[++em]=y;
	nx[em]=ls[x];
	ls[x]=em;
}
int st[N],E[N][2];
void Subtask1(){
	n=read(),m=read();
	ans=em=0;
	for(int i=1;i<=n;i++)ls[i]=0;
	for(int i=1,p,q;i<n;i++){
		p=read(),q=read();
		insert(p,q);
		insert(q,p);
		E[i][0]=p,E[i][1]=q;
	}
	for(int i=1;i<=m;i++)st[i]=read();
	ans=fac[n-2]*m%mod;
	if(n>2)ans-=fac[n-3]*m%mod*(m-1)%mod*mod2%mod;
	printf("%lld\n",(ans%mod+mod)%mod);
}
int vis[N];
int a[N];
ll f[N];
int s[N];
bool bz[N];
int d[N],top;
void dg1(int x){
	if(!x){
		if(!bz[a[1]])return;
		for(int i=1;i<=n;i++)s[i]=0;
		for(int i=1;i<n;i++)s[E[i][0]]++,s[E[i][1]]++;
		top=0;
		for(int i=1;i<n;i++){
			while(top&&s[E[d[top]][0]]+s[E[d[top]][1]]==0)top--;
			if(top&&E[d[top]][0]!=E[a[i]][0]&&E[d[top]][0]!=E[a[i]][1])
				if(E[d[top]][1]!=E[a[i]][0]&&E[d[top]][1]!=E[a[i]][1])
					return;
			s[E[a[i]][0]]--;
			s[E[a[i]][1]]--;
			d[++top]=a[i];
		}ans++;
		return;
	}
	for(int i=1;i<n;i++){
		if(vis[i])continue;
		vis[i]=1;
		a[x]=i;
		dg1(x-1);
		vis[i]=0;
	}
}
void Subtask2(){
	n=read(),m=read();
	ans=em=0;
	for(int i=1;i<=n;i++)ls[i]=0;
	for(int i=1,p,q;i<n;i++){
		bz[i]=0;
		p=read(),q=read();
		insert(p,q);
		insert(q,p);
		E[i][0]=p,E[i][1]=q;
	}
	for(int i=1;i<=m;i++)bz[st[i]=read()]=1;
	dg1(n-1);
	printf("%lld\n",ans);
}
void dg2(int x,int father){
	f[x]=0;
	s[x]=0;
	ll F=1;
	for(int i=ls[x];i;i=nx[i]){
		if(e[i]==father)continue;
		dg2(e[i],x);
		F=F*f[e[i]]%mod*fac[s[e[i]]]%mod;
		s[x]++;
	}
	for(int i=ls[x];i;i=nx[i]){
		if(e[i]==father)continue;
		(f[x]+=F*ifac[s[e[i]]]%mod*fac[s[e[i]]+1]%mod)%=mod;
	}
	if(s[x]==0)f[x]=1;
}
ll C(ll x,ll y){return fac[x]*ifac[x-y]%mod*ifac[y]%mod;}
void Subtask3(){
	n=read(),m=read();
	ans=em=0;
	for(int i=1;i<=n;i++)ls[i]=0;
	for(int i=1,p,q;i<n;i++){
		p=read(),q=read();
		insert(p,q);
		insert(q,p);
		E[i][0]=p,E[i][1]=q;
	}
	for(int i=1;i<=m;i++)st[i]=read();
	dg2(E[st[1]][0],E[st[1]][1]);
	dg2(E[st[1]][1],E[st[1]][0]);
	printf("%lld\n",f[E[st[1]][0]]*f[E[st[1]][1]]%mod*fac[s[E[st[1]][0]]+s[E[st[1]][1]]]%mod);
}
char End;
int main(){
	inv[0]=inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;
	for(int i=2;i<=2e5;i++){
		inv[i]=(mod-mod/i)*inv[mod%i]%mod;
		fac[i]=fac[i-1]*i%mod;
		ifac[i]=ifac[i-1]*inv[i]%mod;
	}
//	printf("%d\n",(&End-&Begin)/1024);
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	int test=read(),Case=read();
	if(test==18){while(Case--)printf("1\n");return 0;}
	if(test>=19&&test<=21){while(Case--)Subtask1();return 0;}
	if(test<=3){while(Case--)Subtask2();return 0;}
	if(test>=4&&test<=6){while(Case--)Subtask3();return 0;}
	while(Case--)Subtask2();
	return 0;
}
