#include using namespace std; typedef long long ll; const ll mod = 1e9 + 7; struct node { ll to; ll nxt; bool tag; } e[200100]; struct edge { ll u, v; } a[200100]; ll id, T, n, m, rt, tot, S, ans; ll head[200100]; ll in[200100]; ll cnt[200100]; ll fac[200100]; ll inv[200100]; ll dp_up[200100]; ll dp_down[200100]; ll num_up[200100]; ll num_down[200100]; ll inv_down[200100]; bool is[200100]; inline void add(ll u, ll v, bool tag) { tot++; e[tot].to = v; e[tot].nxt = head[u]; e[tot].tag = tag; head[u] = tot; return; } //ll qpow(ll x, ll y) { // if (!y) { // return 1; // } // ll ss = qpow(x, y >> 1); // if (y & 1) { // return ss * ss % mod * x % mod; // } else { // return ss * ss % mod; // } //} void dfs(ll u, ll fa) { if (u == rt) { num_down[u] = in[u] - 1; inv_down[u] = inv[in[u] - 1]; for (ll i = head[u]; i != 0; i = e[i].nxt) { ll v = e[i].to; if (v == fa) { continue; } dfs(v, u); num_up[u] = (num_up[u] * num_down[v] + num_down[u] * num_up[v]) % mod; num_down[u] = num_down[u] * num_down[v] % mod; inv_down[u] = inv_down[u] * inv_down[v] % mod; } ll ss = cnt[u]; num_up[u] += cnt[u] * num_down[u] % mod * inv[in[u] - 1] % mod * (in[u] - 1) % mod; num_up[u] %= mod; num_up[u] = (num_up[u] - cnt[u] * (cnt[u] - 1) / 2 % mod * num_down[u] % mod * inv[in[u] - 1] % mod + mod) % mod; for (ll i = head[u]; i != 0; i = e[i].nxt) { ll v = e[i].to; if (v == fa) { continue; } if (e[i].tag) { dp_up[v] = num_down[v]; } ll zz = dp_up[v] * inv_down[v] % mod; ll xx = zz * num_down[u] % mod * inv[in[u] - 1] % mod; dp_up[u] = (dp_up[u] + xx) % mod; // if (u == 1 && v == 2) { // cout << "##" << xx << " " << in[u] - 2 << endl; // } num_up[u] = (num_up[u] + xx * (in[u] - 1)) % mod; ll yy = ss * zz % mod * num_down[u] % mod * inv[in[u] - 1] % mod; num_up[u] = (num_up[u] - yy + mod) % mod; ss = (ss + zz) % mod; } } else { num_down[u] = in[u] - 1; inv_down[u] = inv[in[u] - 1]; for (ll i = head[u]; i != 0; i = e[i].nxt) { ll v = e[i].to; if (v == fa) { continue; } dfs(v, u); num_up[u] = (num_up[u] * num_down[v] + num_down[u] * num_up[v]) % mod; num_down[u] = num_down[u] * num_down[v] % mod; inv_down[u] = inv_down[u] * inv_down[v] % mod; } dp_up[u] = cnt[u] * num_down[u] % mod * inv[in[u] - 1] % mod; ll ss = cnt[u]; num_up[u] += cnt[u] * num_down[u] % mod * inv[in[u] - 1] % mod * (in[u] - 2) % mod; num_up[u] %= mod; num_up[u] = (num_up[u] - cnt[u] * (cnt[u] - 1) / 2 % mod * num_down[u] % mod * inv[in[u] - 1] % mod + mod) % mod; for (ll i = head[u]; i != 0; i = e[i].nxt) { ll v = e[i].to; if (v == fa) { continue; } if (e[i].tag) { dp_up[v] = num_down[v]; } ll zz = dp_up[v] * inv_down[v] % mod; ll xx = zz * num_down[u] % mod * inv[in[u] - 1] % mod; dp_up[u] = (dp_up[u] + xx) % mod; num_up[u] = (num_up[u] + xx * (in[u] - 2)) % mod; ll yy = ss * zz % mod * num_down[u] % mod * inv[in[u] - 1] % mod; num_up[u] = (num_up[u] - yy + mod) % mod; ss = (ss + zz) % mod; } } return; } int main() { // freopen("traverse12.in", "r", stdin); // freopen("traverse12.out", "w", stdout); freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); fac[0] = fac[1] = inv[0] = inv[1] = 1; for (ll i = 2; i <= 100000; i++) { fac[i] = fac[i - 1] * i % mod; inv[i] = inv[mod % i] * (mod - mod / i) % mod; } scanf("%lld%lld", &id, &T); while (T--) { scanf("%lld%lld", &n, &m); for (ll i = 1; i < n; i++) { scanf("%lld%lld", &a[i].u, &a[i].v); in[a[i].u]++; in[a[i].v]++; } for (ll i = 1; i <= m; i++) { ll x; scanf("%lld", &x); is[x] = 1; } if (n == 2) { printf("1\n"); } else { for (ll i = 1; i < n; i++) { if (in[a[i].u] > 1 && in[a[i].v] > 1) { add(a[i].u, a[i].v, is[i]); add(a[i].v, a[i].u, is[i]); // cout << "@" << a[i].u << " " << a[i].v << endl; } else { if (is[i]) { if (in[a[i].u] > 1) { cnt[a[i].u]++; } else { cnt[a[i].v]++; } } } } S = 1; for (ll i = 1; i <= n; i++) { if (in[i] > 1) { S = S * fac[in[i] - 2] % mod; } } rt = 0; for (ll i = 1; i <= n; i++) { if (in[i] > 1) { rt = i; break; } } // cout << rt << " " << S << " " << cnt[rt] << endl; dfs(rt, 0); ans = num_up[rt]; ans = (ans % mod + mod) % mod; ans = ans * S % mod; printf("%lld\n", ans); } ans = tot = 0; for (ll i = 1; i <= n; i++) { head[i] = 0; in[i] = 0; is[i] = 0; dp_up[i] = 0; dp_down[i] = 0; num_up[i] = 0; num_down[i] = 0; cnt[i] = 0; } } return 0; }