#include using namespace std; #define il inline #define ll long long const int N=1e5+5,M=1e5,P=1e9+7,G=5e8+4; int c,T,n,k,cnt=1; int head[N],deg[N]; ll ans,sum; ll fac[N],inv[N],f[N],g[N]; bool vis[N]; struct Edge{ int v,w,to; }e[N<<1]; il void AddEdge(int x,int y,int z){ e[cnt]={y,z,head[x]}; head[x]=cnt++,deg[y]++; return ; } il ll QuickPow(ll a,int b){ ll res=1; while(b){ if(b&1)res=res*a%P; a=a*a%P; b>>=1; } return res; } il void Dfs(int x,int fa){ f[x]=0; for(int i=head[x];i;i=e[i].to){ int y=e[i].v,z=e[i].w; if(y==fa)continue; Dfs(y,x); if(vis[z]){ f[x]=(f[x]+1)%P; ans=(ans-sum*f[y]%P)%P; }else f[x]=(f[x]+f[y])%P; } if(deg[x]>1)f[x]=f[x]*fac[deg[x]-2]%P*inv[deg[x]-1]%P; return ; } il void Dfs2(int x,int fa){ for(int i=head[x];i;i=e[i].to){ int y=e[i].v,z=e[i].w; if(y==fa)continue; ll _f=f[x]; if(deg[x]>1)_f=_f*inv[deg[x]-2]%P*fac[deg[x]-1]%P; if(vis[z])_f=(_f-1)%P; else _f=(_f-f[y])%P; if(deg[x]>1)_f=_f*fac[deg[x]-2]%P*inv[deg[x]-1]%P; if(vis[z]){ g[y]=1; ans=(ans-(g[x]+_f)*sum%P)%P; }else g[y]=(g[x]+_f)%P; if(deg[y]>1)g[y]=g[y]*fac[deg[y]-2]%P*inv[deg[y]-1]%P; Dfs2(y,x); } return ; } il void Build(){ cin>>n>>k; cnt=1; for(int i=1;i<=n;i++)head[i]=deg[i]=0; for(int i=1;i>u>>v; AddEdge(u,v,i),AddEdge(v,u,i); } for(int i=1;i<=k;i++){ int x;cin>>x; vis[x]=true; } ans=0,sum=1; for(int i=1;i<=n;i++)sum=sum*fac[deg[i]-1]%P; Dfs(1,0),Dfs2(1,0); ans=(ans*G%P+k*sum%P)%P; cout<<(ans+P)%P<<"\n"; return ; } int main(){ freopen("traverse.in","r",stdin); freopen("traverse.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); fac[0]=1; for(int i=1;i<=M;i++)fac[i]=fac[i-1]*i%P; inv[M]=QuickPow(fac[M],P-2); for(int i=M-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%P; cin>>c>>T; while(T--)Build(); return 0; }