#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define fi first
#define se second

using namespace std;

const int mod=1e9+7;

void ad(int &x,int y){
	x+=y;
	if(x>=mod) x-=mod;
}

namespace sub1{
	const int N=15;
	const int M=(1<<21);
	
	int n,K;
	pair <int,int> E[N],e[N*N]; 
	vector <pair <int,int> > vec[N];
	int pre[N];
	bool vis[N],pd[M];
	
	void dfs(int u,int cnt,int sta){
		vis[u]=1;
		bool fl=0;
		for(auto x:vec[u]){
			int v=x.fi,w=x.se;
			if(vis[v]) continue;
			fl=1;
			vis[v]=1;
			pre[v]=u;
			dfs(v,cnt+1,sta|(1<<(w-1)));
			vis[v]=0;
			pre[v]=0;
		}
		if(fl) return;
		if(!pre[u]) pd[sta]=1;
		else dfs(pre[u],cnt,sta);
	}
	
	void main(){
		cin>>n>>K;
		for(int i=1;i<n;i++) cin>>E[i].fi>>E[i].se;
		
		for(int i=1;i<=n;i++) vec[i].clear();
		memset(pd,0,sizeof(pd));
		
		int id=0;
		for(int i=1;i<n;i++)
			for(int j=1;j<i;j++){
				bool fl=0;
				
//				if(i==3 && j==2) cout<<"qwq "<<E[i].fi<<' '<<E[i].se<<' '<<E[j].fi<<' '<<E[j].se<<'\n';
				
				if(E[i].fi==E[j].fi) fl=1;
				if(E[i].fi==E[j].se) fl=1;
				if(E[i].se==E[j].fi) fl=1;
				if(E[i].se==E[j].se) fl=1;
				
				if(fl){
					++id;
					e[id]={i,j};
					vec[i].pb({j,id}),vec[j].pb({i,id});
				}
			}
			
		for(int i=0;i<(1<<id);i++) pd[i]=0;
		for(int i=1,x;i<=K;i++){
			cin>>x;
			memset(vis,0,sizeof(vis));
			dfs(x,1,0);
		}
		
		
		int res=0;
		for(int sta=0;sta<(1<<id);sta++) ad(res,pd[sta]); 
		cout<<res<<'\n';
	}
}

namespace sub2{
	void main(){
		cout<<1<<'\n';
	}
}

namespace sub3{
	int n,K;
	
	const int N=1e5+5;
	
	int fac[N];
	
	void init(){
		fac[0]=1;
		for(int i=1;i<=N-5;i++) fac[i]=(1ll*fac[i-1]*i)%mod;
	}
	
	void main(){
		cin>>n>>K;
		for(int i=1,u,v;i<n;i++) cin>>u>>v;
		for(int i=1,x;i<=K;i++) cin>>x;
		int res=0;
		int x=fac[n-2];
		for(int i=1;i<=min(K,n-2);i++){
			ad(res,x);
			ad(x,mod-fac[n-3]);
		}
		cout<<res<<'\n';
	}
}

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	
	cin.tie(0); ios::sync_with_stdio(false);
	
	sub3::init();
	
	int c,T;
	cin>>c>>T;
	if(c<=3) while(T--) sub1::main();
	else if(c==18) while(T--) sub2::main();
	else while(T--) sub3::main();
	
	return 0;
}
