#include<bits/stdc++.h>
#define pb push_back
#define is insert
#define fi first
#define se second
#define mkp make_pair
#define INF INT_MAX
#define mem(a,b) memset(a,b,sizeof a)
#define cpy(a,b) memcpy(a,b,sizeof b)
#define mathmod(a,m) (((a)%(m)+(m))%(m))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=10;
const int M=105;
const int MOD=1e9+7;
int cas,t,x;
int n,m,k,ans,vis[N];
pii e[N];
vector<int> G[N];
void dfs(int u){
	vis[u]=1;
	bool flag=1;
	for(int i=1;i<=m;i++) flag&=vis[i];
	if(flag){ans++;return;}
	for(int v:G[u]){
		if(vis[v]) continue;
		dfs(v);
		vis[v]=0;
	}
}
void solve1(){
	cin>>n>>k,m=n-1;
	for(int i=1;i<=m;i++) cin>>e[i].fi>>e[i].se;
	for(int i=1;i<=k;i++) cin>>x;
	for(int i=1;i<=m;i++){
		for(int j=1;j<i;j++){
			if(i==j) continue;
			if(e[i].fi==e[j].fi||e[i].fi==e[j].se||e[i].se==e[i].fi||e[i].se==e[j].se){
				G[i].pb(j),G[j].pb(i);
			}
		}
	}
	dfs(x);
	cout<<ans<<"\n";
}
void init(){
	if(cas>=1&&cas<=3){
		ans=0,mem(vis,0);
		for(int i=0;i<N;i++) G[i].resize(0);
	}
	else if(cas>=19&&cas<=21) ans=1;
}
int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>cas>>t;
	while(t--){
		init();
		if(cas>=1&&cas<=3) solve1();
		else if(cas==18) cout<<"1\n";
		else if(cas>=19&&cas<=21){
			cin>>n>>k,m=n-1;
			for(int i=1;i<=m;i++) cin>>e[i].fi>>e[i].se;
			for(int i=1;i<=k;i++) cin>>x;
			for(int i=1;i<m;i++) ans=1ll*ans*i%MOD;
			cout<<ans<<"\n";
		}
		else solve1();
	}
	cout<<flush;
	return 0;
}
/*
20 2
8 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
9 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
*/

