#include using namespace std; namespace Solve{ typedef long long ll; const int N=100010,mod=1e9+7; inline void Add(int&x,int y){ x=(x+y>=mod?x+y-mod:x+y); } inline void Sub(int&x,int y){ x=(x-y<0?x-y+mod:x-y); } int qmi(int a,int b){ int r=1; for(;b;b>>=1){ if(b&1)r=(ll)r*a%mod; a=(ll)a*a%mod; } return r; } int jc[N],ny[N]; void prepare_C(int nn){ jc[0]=1; for(int i=1;i<=nn;i++)jc[i]=(ll)jc[i-1]*i%mod; ny[nn]=qmi(jc[nn],mod-2); for(int i=nn;i;i--)ny[i-1]=(ll)ny[i]*i%mod; } int nyn[N]; int c,T; int n,k; int head[N],ver[N<<1],ne[N<<1],idx=2; bool st[N<<1]; void add(int x,int y){ ver[idx]=y,ne[idx]=head[x],head[x]=idx++; } int deg[N]; int f[N][2],res; void dp(int x,int fa,int dd=0){ f[x][0]=f[x][1]=0; for(int i=head[x];i;i=ne[i]) if(ver[i]!=fa){ dp(ver[i],x,dd+1); int v[2]={f[ver[i]][0],f[ver[i]][1]}; if(st[i])Add(v[1],v[0]),v[0]=0; int vv=0; Add(vv,(ll)(f[x][0]+f[x][1])*(v[0]+v[1])%mod); Sub(vv,(ll)f[x][0]*v[0]%mod); if(vv)Add(res,(ll)vv*nyn[deg[x]-1]%mod); Add(f[x][0],v[0]),Add(f[x][1],v[1]); } if(deg[x]==1){ if(fa){ f[x][0]=1; } else{ Add(res,f[x][1]); } } else{ f[x][0]=(ll)f[x][0]*nyn[deg[x]-1]%mod; f[x][1]=(ll)f[x][1]*nyn[deg[x]-1]%mod; } } void main(){ prepare_C(100000); nyn[1]=1; for(int i=2;i<=100000;i++)nyn[i]=mod-(ll)mod/i*nyn[mod%i]%mod; cin>>c>>T; while(T--){ cin>>n>>k; for(int i=1;i>x>>y; add(x,y),add(y,x); deg[x]++,deg[y]++; } while(k--){ int e;cin>>e; st[e<<1]=st[e<<1|1]=1; } int vv=1; for(int i=1;i<=n;i++)vv=(ll)vv*jc[deg[i]-1]%mod; res=0; dp(1,0); cout<<(ll)res*vv%mod<<'\n'; idx=2; for(int i=1;i<=n;i++){ head[i]=0; st[i<<1]=st[i<<1|1]=0; deg[i]=0; } } } } signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); freopen("traverse.in","r",stdin); freopen("traverse.out","w",stdout); Solve::main(); return 0; }