#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N=1e5+50;
ll t,la[N],idx,ans,n,k,c;
vector<ll>dm[N];
struct Node{
	ll to,nex;
}tt[N*2];
bool vis[N];

void add(ll u,ll v){
	idx++;
	tt[idx].nex=la[u],tt[idx].to=v,la[u]=idx; 
}

void dfs(ll x,ll fu,ll cnt){
	if(cnt==n-1){
		ans++;
	}
	for(ll i=la[x];i;i=tt[i].nex){
		ll to=tt[i].to;
		if(vis[to]||to==fu)continue;
		vis[to]=1;
		dfs(to,x,cnt+1);
		vis[to]=0;
	}
}

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	scanf("%lld%lld",&c,&t);
	while(t--){
		ans=idx=0;
		memset(la,0,sizeof(la));
		scanf("%lld%lld",&n,&k);
		for(ll i=1;i<n;i++){
			ll u,v;
			scanf("%lld%lld",&u,&v);
			ll oo1=dm[u].size(),oo2=dm[v].size();
			for(ll j=0;j<oo1;j++)add(dm[u][j],i),add(i,dm[u][j]);
			for(ll j=0;j<oo2;j++)add(dm[v][j],i),add(i,dm[v][j]);
			dm[u].push_back(i),dm[v].push_back(i);
		}
//		for(ll i=1;i<=n-1;i++){
//			printf("%lld : ",i);
//			for(ll j=la[i];j;j=tt[j].nex)printf("%lld ",tt[j].to);
//			printf("\n");
//		}
		for(ll i=1;i<=k;i++){
			ll rot;
			scanf("%lld",&rot);
			vis[rot]=vis[0]=1;
			dfs(rot,0,1);
		}
		printf("%lld\n",ans);
	}	
	
	return 0;
}
/*
7 1
5 1
1 2
1 3
2 4
2 5
1
*/
