#include using namespace std; #define ll long long const int N=1e5+5, mod=1e9+7; ll qp(ll x, ll y){ ll ans=1; for(;y;y/=2,x=x*x%mod){ if(y&1) ans=ans*x%mod; } return ans; } void add(ll &x, ll y){ x=(x+y)%mod; } struct node{ int to, next; }e[2*N]; int h[N], cnt; void add_eg(int x, int y){ e[++cnt]=node{y, h[x]}; h[x]=cnt; } ll jc[N], inv[N]; // inv: 1/x int rd[N]; int fa[N], dep[N]; void dfs1(int x, int ff){ fa[x]=ff, dep[x]=dep[ff]+1; for(int i=h[x]; i; i=e[i].next){ int y=e[i].to; if(y==ff) continue; dfs1(y, x); } } int tag[N]; ll f[N]; ll res; void dfs2(int x, int ff){ f[x]=0; for(int i=h[x]; i; i=e[i].next){ int y=e[i].to; if(y==ff) continue; dfs2(y, x); add(res, f[x]*f[y]); add(f[x], f[y]*inv[rd[x]-1]); } if(tag[x]){ add(res, f[x]); f[x]=1; } } int px[N], py[N]; int main(){ freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); inv[0]=1; inv[1]=1; for(int i=2; i> c >> T; while(T--){ int n, m; cin >> n >> m; for(int i=1; i<=n; ++i){ h[i]=0; rd[i]=0; } cnt=0; for(int i=1, x, y; i> x >> y; add_eg(x, y); add_eg(y, x); px[i]=x, py[i]=y; rd[x]++, rd[y]++; } dfs1(1, 0); for(int i=1; i<=n; ++i){ tag[i]=0; } for(int i=1; i<=m; ++i){ int p; cin >> p; int x=px[p], y=py[p]; // fprintf(stderr, "%d %d: %d %d\n", x, y, rd[x], rd[y]); if(fa[x]==y) tag[x]=1; else tag[y]=1; } res=0; dfs2(1, 0); ll mul=1; for(int i=1; i<=n; ++i){ mul=mul*jc[rd[i]-1]%mod; } ll ans=(m+mod-res)*mul%mod; cout << ans << '\n'; } return 0; }