#include using namespace std; const int N = 1e5 + 10, ma = 1e5, mod = 1e9 + 7; int t, n, k, x, y, cnt, c[N], head[N], to[N << 1], ne[N << 1]; long long ans, sum, g[N], po[N], di[N]; bool mark[N << 1]; inline long long h(long long x){ return x % mod; } inline long long mypow(long long x, long long y){ long long ans = 1; while(y){ if(y & 1) ans = h(ans * x); x = h(x * x), y >>= 1; } return ans; } inline void add(int x, int y){ to[++cnt] = y, ne[cnt] = head[x], head[x] = cnt, mark[cnt] = false; return ; } inline void dfs(int x, int y){ long long step = h(di[c[x] - 1] * po[max(0, c[x] - 2)]); for(int i = head[x];i != -1;i = ne[i]){ int v = to[i]; if(v == y) continue; dfs(v, x), ans = h(ans - (mark[i] ? g[x] + g[v] : g[v] * g[x])); g[x] = h(g[x] + (mark[i] ? step : g[v] * step)); } sum = h(sum * po[c[x] - 1]); return ; } int main(){ freopen("traverse.in","r",stdin); freopen("traverse.out","w",stdout); ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin>>x>>t, po[0] = 1; for(int i = 1;i <= ma;i = -~i) po[i] = h(po[i - 1] * i); di[ma] = mypow(po[ma], mod - 2); for(int i = ma - 1;i >= 0;i = ~-i) di[i] = h(di[i + 1] * (i + 1)); while(t --){ cin>>n>>k, sum = 1, ans = k, cnt = 0; for(int i = 1;i <= n;i = -~i) c[i] = g[i] = 0, head[i] = -1; for(int i = 1;i < n;i = -~i) cin>>x>>y, add(x, y), add(y, x), c[x] ++, c[y] ++; for(int i = 1;i <= k;i = -~i) cin>>x, mark[2 * x - 1] = mark[2 * x] =true; dfs(1, 0), cout<