#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <cassert>
#include <random>
#include <chrono>
#include <ctime>
#include <numeric>
typedef long long ll;
typedef double lf;
typedef unsigned long long ull;
namespace FastIO
{
const int MAXSIZE = (1 << 20);
char buf[MAXSIZE], *p1, *p2;
#define gc (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) ? EOF : *p1++)
template <typename T>
inline void Read(T &x)
{
x = 0; char ch = gc; bool f = 0;
while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = gc; }
while (ch >= '0' && ch <= '9') x = x * 10 + (ch ^ 48), ch = gc;
if (f) x = -x;
}
}
using FastIO::Read;
using namespace std;
const int MAXN = 1e5 + 10, mod = 1e9 + 7;
ll fac[MAXN];
int n, m, key[MAXN];
struct Edge
{
int u, v;
}gg[MAXN];
vector <int> e[MAXN];
bool avl[MAXN];
int dep[MAXN];
ll val[MAXN], oval[MAXN];
void DFS1(int u, int fa)
{
dep[u] = dep[fa] + 1;
val[u] = (e[u].size() > 1 ? e[u].size() - 1 : 1);
for (auto v : e[u])
if (v != fa) oval[v] = val[u], DFS1(v, u), val[u] = val[u] * val[v] % mod;
}
void DFS3(int u, int fa)
{
ll sum = 1;
for (int i = e[u].size() - 1; ~i; i--)
{
int v = e[u][i];
if (v == fa) continue;
oval[v] = oval[v] * sum % mod * oval[u] % mod;
sum = sum * val[v] % mod;
DFS3(v, u);
}
}
ll f[MAXN][2], ans, res[2];
void DFS2(int u, int fa)
{
f[u][0] = f[u][1] = 0;
if (u != 1 && e[u].size() == 1)
{
f[u][avl[u]] = 1;
return ;
}
for (auto v : e[u]) if (v != fa) DFS2(v, u);
ll sum = 1;
res[0] = res[1] = 0;
for (auto v : e[u])
{
if (v == fa) continue;
res[0] = (val[v] * res[0] + f[v][0] * f[u][0]) % mod;
res[1] = (val[v] * res[1] + f[v][0] * f[u][1] + f[v][1] * f[u][0] + f[v][1] * f[u][1]) % mod;
f[u][0] = (val[v] * f[u][0] + f[v][0] * sum) % mod;
f[u][1] = (val[v] * f[u][1] + f[v][1] * sum) % mod;
sum = sum * val[v] % mod;
}
ans = (ans + res[1] * oval[u]) % mod;
if (u == 1 && e[u].size() == 1) ans = (ans + f[u][1]) % mod;
if (avl[u]) f[u][1] = (f[u][1] + f[u][0]) % mod, f[u][0] = 0;
}
int main()
{
freopen("traverse.in", "r", stdin);
freopen("traverse.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0);
fac[0] = 1;
for (int i = 1; i < MAXN; i++) fac[i] = fac[i - 1] * i % mod;
int Case, T;
Read(Case), Read(T);
int tt = 0;
while (T--)
{
Read(n), Read(m);
for (int i = 1; i <= n; i++)
{
e[i].clear();
avl[i] = 0;
val[i] = oval[i] = 0;
}
for (int i = 1, x, y; i < n; i++) Read(x), Read(y), e[x].emplace_back(y), e[y].emplace_back(x), gg[i] = {x, y};
for (int i = 1; i <= m; i++) Read(key[i]);
tt++;
if (n == 2) { cout << "1\n"; continue; }
DFS1(1, 0);
for (int i = 1; i <= m; i++)
{
int u = key[i];
if (dep[gg[u].u] > dep[gg[u].v]) avl[gg[u].u] = 1;
else avl[gg[u].v] = 1;
}
oval[1] = 1; DFS3(1, 0);
ans = 0, DFS2(1, 0);
for (int i = 1; i <= n; i++)
if (e[i].size() > 2) ans = ans * fac[e[i].size() - 2] % mod;
cout << ans << '\n';
}
return 0;
}