#include using namespace std; const int mod = 1e9 + 7; int n, op, T, x, y, fa[100010], q[100010]; long long ans, fct[100010], f[100010], g[100010], d[100010], W, k, tot; bool b[100010]; vector v[100010]; struct E{ int x, y; } e[100010]; long long F(long long a, long long b){ long long ans = 1; for(long long i = 1; i <= b; i <<= 1){ if(i & b) ans = ans * a % mod; a = a * a % mod; } return ans; } void fun(){ fct[0] = 1, g[0] = 0; for(int i = 1; i <= 1e5; i++){ fct[i] = fct[i - 1] * i % mod; g[i] = F(i, mod - 2); } } void dfs(int x, int f){ q[++tot] = x; fa[x] = f; for(int u : v[x]){ if(u == f) continue; int y = (e[u].x ^ e[u].y ^ x); dfs(y, u); } } void Solve(int x){ if(v[x].size() == 1 && fa[x]) return; for(int u : v[x]){ if(u == fa[x]) continue; int y = (e[u].x ^ e[u].y ^ x); if(b[u]){ ans = (ans + f[y]) % mod; f[y] = 1; } ans = (ans + f[x] * f[y]) % mod; f[x] = (f[x] + f[y] * g[v[x].size() - 1] % mod) % mod; } } int main(){ freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> op >> T; fun(); while(T--){ cin >> n >> k; ans = tot = 0, W = 1; for(int i = 1; i <= n; i++){ v[i].clear(); f[i] = 0, b[i] = 0; e[i].x = e[i].y = 0; } for(int i = 1; i < n; i++){ cin >> x >> y; e[i].x = x, e[i].y = y; v[y].push_back(i); v[x].push_back(i); } for(int i = 1; i <= k; i++){ cin >> x; b[x] = 1; } int sum = 0; for(int i = 1; i <= n; i++){ W = W * fct[v[i].size() - 1] % mod; sum += v[i].size(); } sum /= 2; dfs(1, 0); for(int i = tot; i; i--) Solve(q[i]); cout << W * (k - ans + mod) % mod << "\n"; } return 0; }