#include using namespace std; #define int long long #define double long double #define endl '\n' mt19937 rnd(537462565); const int mod=1000000007,N=100000; int fct[N+9],ifct[N+9]; int cas,caso,n,k,ep[N+9],deg[N+9],tot,ans,sz[N+9],dp[N+9],sum[N+9]; bool pr[N+9]; array ed[N+9]; struct Edge{int nxt,u,v,id;}e[N+9<<1]; int hd[N+9],tote; void adde(int u,int v,int id){ e[++tote]={hd[u],u,v,id}; hd[u]=tote; } int qpow(int a,int b,int res=1){ while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;} return res; } void init(){ fct[0]=1; for(int i=1;i<=N;i++)fct[i]=fct[i-1]*i%mod; ifct[N]=qpow(fct[N],mod-2); for(int i=N;i;i--)ifct[i-1]=ifct[i]*i%mod; } void dfs1(int u,int f){ for(int i=hd[u];i;i=e[i].nxt){ int v=e[i].v; if(v==f)continue; dfs1(v,u); sz[u]+=sz[v]+pr[e[i].id]; } } void dfs2(int u,int f,int cur){ int cnt=1; for(int i=hd[u];i;i=e[i].nxt){ int v=e[i].v; if(v==f||!sz[v]&&!pr[e[i].id])continue; int icur=cur*ifct[deg[u]-1]%mod*fct[deg[u]-2]%mod*cnt%mod; if(cnt>1)icur=tot*ifct[deg[u]-1]%mod*fct[deg[u]-2]%mod*cnt%mod; if(pr[e[i].id]){ (ans+=tot+mod-icur)%=mod; dfs2(v,u,tot); }else dfs2(v,u,icur); cnt++; } } void dfs3(int u,int f,int cur){ (cur*=ifct[deg[u]-1]%mod*fct[deg[u]-2]%mod)%=mod; for(int i=hd[u];i;i=e[i].nxt){ int v=e[i].v; if(v==f)continue; if(pr[e[i].id]){ (ans+=mod-cur)%=mod; continue; } dfs3(v,u,cur); } } void dfs4(int u,int f){ sum[u]=0; for(int i=hd[u];i;i=e[i].nxt){ int v=e[i].v; if(v==f)continue; dfs4(v,u); int y=sum[v]*ifct[deg[u]-1]%mod*fct[deg[u]-2]%mod; if(pr[e[i].id]){ (ans+=mod-sum[v]*tot%mod)%=mod; (ans+=mod-sum[u]*tot%mod)%=mod; y=ifct[deg[u]-1]%mod*fct[deg[u]-2]%mod; }else (ans+=mod-sum[v]*sum[u]%mod*tot%mod)%=mod; (sum[u]+=y)%=mod; } } signed main(){ freopen("traverse.in","r",stdin); freopen("traverse.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>caso>>cas;init(); while(cas--){ cin>>n>>k; for(int i=1;i<=n;i++)hd[i]=deg[i]=sz[i]=pr[i]=0; tot=1;ans=0;tote=0; for(int i=1;i>ed[i][0]>>ed[i][1]; adde(ed[i][0],ed[i][1],i); adde(ed[i][1],ed[i][0],i); deg[ed[i][0]]++;deg[ed[i][1]]++; } for(int i=1;i<=n;i++)(tot*=fct[deg[i]-1])%=mod; for(int i=1;i<=k;i++)cin>>ep[i],pr[ep[i]]=1; if(k<=0){ ans=tot; int sk=ep[1]; dfs1(ed[sk][0],ed[sk][1]); dfs1(ed[sk][1],ed[sk][0]); dfs2(ed[sk][0],ed[sk][1],tot); dfs2(ed[sk][1],ed[sk][0],tot); cout<