#include<bits/stdc++.h>
#define ll long long
#define sco 100010
using namespace std;
ll T,n,m,ans,len,cnt,vis[sco];
struct node{
	ll u,v;
}a[1010];
vector<ll>e[sco];
vector<pair<ll,ll>>g[sco];
void dfs(ll x){
	ll ok=1;
	for(int i=1;i<n;++i){
		if(vis[i]==0){
			ok=0;
			break;
		}
	}
	ans+=ok;
	for(auto v:e[x]){
		if(vis[v]==0){
			vis[v]=1;
			dfs(v);
			vis[v]=0;
		}
	}
	return;
}
int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	scanf("%*lld%lld",&T);
	while(T--){
		scanf("%lld%lld",&n,&m);
		for(int i=1;i<n;++i){
			scanf("%lld%lld",&a[i].u,&a[i].v);
		}
		for(int i=1;i<n;++i){
			for(int j=1;j<n;++j){
				if(a[i].u==a[j].u || a[i].u==a[j].v || a[i].v==a[j].u || a[i].v==a[j].v){
					if(i==j)continue;
					e[i].push_back(j);
				}
			}
		}
		len=1;
		for(int i=1;i<=m;++i){
			ll x;
			scanf("%lld",&x);
			vis[x]=1;
			dfs(x);
			vis[x]=0;
		}
//		ans=len-1;
//		for(int i=1;i<len;++i)sort(g[i].begin(),g[i].end());
//		for(int i=1;i<len;++i){
//			for(int j=1;j<len;++j){
//				bool ok=0;
//				for(int k=0;k<n-2;++k){
//					if(g[i][k]!=g[j][k]){
//						ok=1;
//						break;
//					}
//				}
//				if(ok==0)--ans;
//			}
//		}
		printf("%lld\n",ans);
	}
	return 0;
}
