#include<bits/stdc++.h>
#define ll long long
#define db double
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
bool mem1;
int C;
namespace MATT{
const int maxn=2e5+10,mod=1e9+7;
int n,k;
int a[maxn];
vector<int> son[maxn];
namespace FastMod{
	inline void madd(int &x,int y){x+=y;(x>=mod)&&(x-=mod);}
	inline void mdel(int &x,int y){x-=y;(x<0)&&(x+=mod);}	
	inline void mmul(int &x,int y){x=1ll*x*y%mod;}
	inline int imadd(int x,int y){madd(x,y);return x;}
	inline int imdel(int x,int y){mdel(x,y);return x;}
	inline int immul(int x,int y){mmul(x,y);return x;}
	inline int qpow(int x,int y){int res=1;while(y){if(y&1)mmul(res,x);mmul(x,x);y>>=1;}return res;}
}
using namespace FastMod;
namespace Task18{
	bool check(){return C==18;}
	void solve(){puts("1");}
}
namespace Task19{
	bool check(){return C==19||C==20||C==21;}
	void solve(){
		int res=(1ll*k*(k+1)/2)%mod,p=res;
		for(int i=k+3;i<=n;i++){
			madd(p,k);
			mmul(res,p);
		}
		printf("%d\n",res);
	}
}
inline void rebuild(){for(int i=1;i<=n+n;i++)son[i].clear();}
inline void add(int u,int v){son[u].pb(v);}
inline void adde(int u,int v){add(u,v);add(v,u);}
bool vis[maxn];
set<set<pii>> res;
set<pii> st;
int c=0;
void dfs2(int u){
	c++;
	vis[u]=true;
	for(int i=0;i<son[u].size();i++){
		int t=son[u][i];
		if(vis[t])	continue;
		st.insert(pii(min(u,t),max(u,t)));
		dfs2(t);
	}
}
void dfs(int x){
	// printf("x = %d\n",x);
	if(x>=n){
		for(int o=1;o<=k;o++){
			st.clear();c=0;
			for(int i=1;i<=n;i++)vis[i]=0;
			dfs2(a[o]);
			// if(c==n-1&&res.find(st)==res.end()){for(pii i:st)printf("%d %d\n",i.fi,i.se);puts("");}
			if(c==n-1)	res.insert(st);
		}
		return;
	}
	int siz=son[x].size(),ord[siz+5];
	vector<int> ss;ss=son[x];
	for(int i=1;i<=siz;i++)	ord[i]=i;
	do{
		for(int i=1;i<=siz;i++)	son[x][i-1]=ss[ord[i]-1];
		dfs(x+1);
	}while(next_permutation(ord+1,ord+siz+1));
}
int mp[20][20];
void matt(){
	res.clear();
	rebuild();
	scanf("%d%d",&n,&k);
	for(int i=1,u,v;i<n;i++){
		scanf("%d%d",&u,&v);
		if(n<=10)	mp[u][v]=mp[v][u]=i;
	}
	for(int i=1;i<=k;i++)	scanf("%d",&a[i]);
	if(Task18::check())	return Task18::solve();
	if(Task19::check())	return Task19::solve();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
				if(mp[i][j]&&mp[j][k]&&mp[i][j]<mp[j][k])	adde(mp[i][j],mp[j][k]);
	dfs(1);
	printf("%d\n",(int)res.size());
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)mp[i][j]=false;
}
}
bool mem2;
int main(){
	freopen("traverse.in","r",stdin);freopen("traverse.out","w",stdout);
	int T=1;scanf("%d%d",&C,&T);while(T--) MATT::matt();
}
