#include using namespace std; typedef long long ll; const ll mod = 1e9 + 7; const int maxn = 1e5 + 5; vector g[maxn]; int dep[maxn], U[maxn], V[maxn], ch[maxn]; bool mk[maxn]; ll f[maxn], fac[maxn], inv[maxn], ans; void dfs(int u, int fu) { ch[u] = g[u].size() - 1; for (int v : g[u]) if (v != fu) dep[v] = dep[u] + 1, dfs(v, u); } void solve(int u, int fu) { f[u] = 0; for (int v : g[u]) if (v != fu) { solve(v, u); (ans += mod - f[u] * f[v] % mod * inv[ch[u]] % mod) %= mod; f[u] += f[v]; if (f[u] >= mod) f[u] -= mod; } if (mk[u]) { (ans += mod - inv[ch[u]] * f[u] % mod) %= mod; f[u] = 1; } else (f[u] *= inv[ch[u]]) %= mod; } void work() { int n, k; cin >> n >> k; ans = k; for (int i = 1; i <= n; i++) g[i].clear(), mk[i] = 0; for (int i = 1; i < n; i++) { cin >> U[i] >> V[i]; g[U[i]].emplace_back(V[i]); g[V[i]].emplace_back(U[i]); } dfs(1, 0); ll res = 1; for (int i = 1; i <= n; i++) (res *= fac[ch[i]]) %= mod; for (int i = 1; i <= k; i++) { int e; cin >> e; int u = U[e], v = V[e]; if (dep[v] < dep[u]) swap(u, v); mk[v] = 1; } solve(1, 0); cout << ans * res % mod << "\n"; } int main() { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); ios::sync_with_stdio(false), cin.tie(0); fac[0] = inv[1] = 1; for (int i = 1; i <= 100000; i++) fac[i] = fac[i - 1] * i % mod; for (int i = 2; i <= 100000; i++) inv[i] = inv[mod % i] * (mod - mod / i) % mod; int cid, T; cin >> cid >> T; while (T--) work(); return 0; }