#include <cstdio>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>

using namespace std;

void re(int &x){
	x=0;int c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
}

const int N=10;

struct ed{
	int x,y;bool operator<(const ed &t)const{return x==t.x?y<t.y:x<t.x;}
	bool operator==(const ed &t)const{return x==t.x&&y==t.y;}
};
set<ed> S,A[114514];int T;

void ins(int x,int y){
	if(x>y) swap(x,y);
	S.insert({x,y});
}

vector<int> adj[N];int n;

struct edg{int v,nxt;}g[N<<1];int hd[N],t;

void ad(int u,int v){g[++t]={v,hd[u]};hd[u]=t;}

void sfd(int u,int l){
	for(int i=hd[u];i;i=g[i].nxt) for(int j=hd[u];j;j=g[j].nxt) if(i!=j) adj[(i+1)>>1].push_back((j+1)>>1);
	for(int i=hd[u];i;i=g[i].nxt) if(g[i].v!=l) sfd(g[i].v,u);
}

bool vis[N];

void dfs(int e){
	if(S.size()==n-2) return A[++T]=S,void();
	vis[e]=1;for(int f:adj[e]) if(!vis[f]) ins(e,f),dfs(f);
}

int K[N],k;

void pre(int i){
	if(i>n-1){
		for(int x=1;x<=k;++x) dfs(K[x]),memset(vis,0,N),S.clear();
		return ;
	}
	do pre(i+1);while(next_permutation(adj[i].begin(),adj[i].end()));
}

int main()
{
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	int c,Ts;re(c);re(Ts);while(Ts--){
		int ans=0;re(n);re(k);
		for(int i=1,x,y;i<n;++i) re(x),re(y),ad(x,y),ad(y,x);
		sfd(1,0);for(int i=1;i<n;++i) sort(adj[i].begin(),adj[i].end());
		for(int i=1;i<=k;++i) re(K[i]);
		pre(1);for(int i=1;i<=T;++i){
			//printf("st %d\n",i);
			//for(ed e:A[i]) printf("ed %d %d\n",e.x,e.y);
			bool f=1;for(int j=1;j<i;++j) if(A[i]==A[j]) f=0;
			ans+=f;
		}
		printf("%d\n",ans);
		memset(hd,0,sizeof(hd));t=T=0;for(int i=1;i<=n;++i) adj[i].clear();
	}
}
/*
0 2

4 1
1 2
2 3
2 4
1

5 2
1 2
1 3
2 4
2 5
1 3
*/
