#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define gc getchar
#define pb push_back
#define abs_(x) max(x,-(x))
#define all(x) x.begin(),x.end()
#define y1 __
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define dFor(i,a,b) for(int i=(a);i>=(b);i--)
#define tomin(x,y) x=min(x,y)
#define tomax(x,y) x=max(x,y)
const int N=1e5+5;
const int P=1e9+7;
int read() 
{
	int x=0; int y=1; char c=gc();
	for(;!isdigit(c);c=gc()) if(c=='-') y=0;
	for(;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^48);
	return y?x:-x; 
}
int C;
int n,K;
struct _E
{
	int u,v;
}ee[N];
vector<int> e[N];
int fa[N];
int a[N];
int rd[N];
ll jc[N],njc[N];
void pre(int n)
{
	jc[0]=1; For(i,1,n) jc[i]=jc[i-1]*i%P;
}
int d[N];
bool imp[N];
int Mn(int u,int v) { return d[u]<d[v]?u:v; }
void dfs0(int u)
{
	d[u]=d[fa[u]]+1;
	for(int v:e[u]) if(v^fa[u])
	{
		fa[v]=u;
		dfs0(v);
	}
}
bool ls[N];
int work()
{
	n=read(),K=read();
	For(u,1,n) e[u].clear(),rd[u]=0;
	memset(imp,0,n+2);
	memset(ls,0,n+2);
	pre(n); 
	For(i,1,n-1)
	{
		int u=read(),v=read();
		e[u].pb(v);
		e[v].pb(u);
		ee[i]=(_E){u,v};
		rd[u]++; 
		rd[v]++;
	}
	For(i,1,K) a[i]=read(),imp[a[i]]=1;
	if(C<=6)
	{
		ll ans=1;
		For(u,1,n) ans=ans*jc[rd[u]-1]%P;
		return ans;
	}
	if(C<=10)
	{
		int t1=ee[a[1]].u,t2=ee[a[1]].v;
		int t3=ee[a[2]].u,t4=ee[a[2]].v;
		fa[t1]=0; dfs0(t1); 
		int s1=min(d[t3],d[t4]);
		fa[t2]=0; dfs0(t2); 
		int s2=min(d[t3],d[t4]);
		if(s2<s1) t1=t2;
		fa[t1]=0; dfs0(t1);
		if(d[t4]<d[t3]) t3=t4;
		for(int t=t3;t;t=fa[t]) ls[t]=1;
//		cout<<t1<<" "<<t3<<endl;
		ll sum=1,ans=1;
		For(u,1,n)
		{
			sum=sum*jc[rd[u]-1]%P;
			if(ls[u]) ans=ans*jc[rd[u]-2]%P;
			else ans=ans*jc[rd[u]-1]%P;
		}
		
		return (sum*2-ans+P)%P;
	} 
	if(C==18) return 1;
	if(C>=19&&C<=21)
	{
		int sum=K; ll ans=0;
		if(n==1) return 1;
		if(n==2) return 1;
		For(i,1,n-2)
		{
			if(imp[i])
			{
				ans+=jc[n-3]*(n-1-i)%P;
				sum--;
			}
			else
			{
				ans+=jc[n-3]*sum%P;
			}
		}
		return ans%P;
	}
	return -1;
}
int main()
{
//	freopen("traverse10.in","r",stdin);
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	C=read();
	int T=read();
	while(T--) printf("%d\n",work());
	return 0;
}









/*
必须要深搜，可能会重复
	圆方树
	若干个团拼起来
	 

k=1：直接 DP

	代表元计数
	DP
		度数最多 3
		起边度数为 2 或 1（点的度数决定）
	随便一棵树，猜测以下便可以七点：
	
	二度点 


*/




