#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 600000
#define INF 1000000000000000000
#define mod 1000000007
ll binpow(ll a, ll b){
ll res = 1;
while (b != 0){
if (b % 2 == 1){
res *= a;
res %= mod;
}
a *= a;
a %= mod;
b /= 2;
}
return res;
}
int n;
vector<vector<int>> v, up;
vector<ll> pa, emp, nee, us, st, en;
vector<ll> f, inv;
ll C(int n, int k){
if (k > n || n < 0 || k < 0) return 0;
return f[n] * inv[k] % mod * inv[n - k] % mod;
}
int nxt = 0;
vector<ll> tr, act, em;
void update(int v, int l, int r, int pos, ll val, int ty){
if (l == r){
if (ty == 0) tr[v] = val;
else tr[v] += val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid){
update(v * 2, l, mid, pos, val, ty);
}
else{
update(v * 2 + 1, mid + 1, r, pos, val, ty);
}
tr[v] = tr[v * 2] + tr[v * 2 + 1];
}
ll query(int v, int l, int r, int ql, int qr){
if (l > qr || r < ql || ql > qr) return 0;
if (ql <= l && r <= qr) return tr[v];
int mid = (l + r) / 2;
return query(v * 2, l, mid, ql, qr) + query(v * 2 + 1, mid + 1, r, ql, qr);
}
void activate(int v, int l, int r, int ql, int qr, int val){
if (l > qr || r < ql) return;
if (ql <= l && r <= qr){
act[v] += val;
return;
}
int mid = (l + r) / 2;
activate(v * 2, l, mid, ql, qr, val);
activate(v * 2 + 1, mid + 1, r, ql, qr, val);
}
int activated(int v, int l, int r, int pos){
if (pos == 0) return 0;
if (l == r) return act[v];
int mid = (l + r) / 2;
if (pos <= mid) return activated(v * 2, l, mid, pos) + act[v];
return activated(v * 2 + 1, mid + 1, r, pos) + act[v];
}
void upd(int v, int l, int r, int pos, int val){
if (pos < l || pos > r) return;
if (l == r){
em[v] += val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid){
upd(v * 2, l, mid, pos, val);
}
else{
upd(v * 2 + 1, mid + 1, r, pos, val);
}
em[v] = em[v * 2] + em[v * 2 + 1];
}
ll quer(int v, int l, int r, int ql, int qr){
if (l > qr || r < ql || ql > qr) return 0;
if (ql <= l && r <= qr) return em[v];
int mid = (l + r) / 2;
return quer(v * 2, l, mid, ql, qr) + quer(v * 2 + 1, mid + 1, r, ql, qr);
}
ll ans = 1, cnt0 = 0;
vector<int> isz;
vector<ll> val;
void dfs(int x, int p){
pa[x] = p;
emp[x] = 1;
nxt++;
st[x] = nxt;
up[x][0] = p;
for (int i = 1; i < 20; i++){
up[x][i] = up[up[x][i - 1]][i - 1];
}
for (auto el : v[x]){
if (el != p){
dfs(el, x);
emp[x] += emp[el];
}
}
upd(1, 1, n, st[x], 1);
en[x] = nxt;
}
void c0p(int x){
if (us[x] == -1) return;
int hm = query(1, 1, n, st[x], st[x]);
if (hm < 0 && isz[x] == 0) cnt0++, isz[x] = 1;
}
void c0m(int x){
if (us[x] == -1) return;
int hm = query(1, 1, n, st[x], st[x]);
if (hm < 0 && isz[x] == 1) cnt0--, isz[x] = 0;
}
void recalc(int x){
ans = (ans * binpow(val[x], mod - 2)) % mod;
val[x] = 1;
if (us[x] == -1) return;
int hm = query(1, 1, n, st[x], st[x]), emm = quer(1, 1, n, st[x], en[x]);
val[x] = C(emm + hm - 1, emm - 1);
ans = (ans * val[x]) % mod;
}
vector<int> al;
void add(int x, int val){
int hm = quer(1, 1, n, st[x], en[x]);
int wh = x;
int me = activated(1, 1, n, st[x]);
x = pa[x];
for (int i = 19; i >= 0; i--){
int to = up[x][i];
if (activated(1, 1, n, st[to]) == me){
x = to;
}
}
c0m(x);
c0m(wh);
us[wh] = val;
int ne = us[wh] - query(1, 1, n, st[wh] + 1, en[wh]);
update(1, 1, n, st[wh], ne, 1);
update(1, 1, n, st[x], -ne, 1);
upd(1, 1, n, st[pa[wh]], -hm);
upd(1, 1, n, st[pa[x]], hm);
activate(1, 1, n, st[wh], en[wh], 1);
al.push_back(x);
al.push_back(wh);
c0p(x);
c0p(wh);
}
void del(int x){
int hm = quer(1, 1, n, st[x], en[x]);
int wh = x;
x = pa[x];
int me = activated(1, 1, n, st[x]);
for (int i = 19; i >= 0; i--){
int to = up[x][i];
if (activated(1, 1, n, st[to]) == me){
x = to;
}
}
c0m(x);
c0m(wh);
us[wh] = -1;
int ne = query(1, 1, n, st[wh], st[wh]);
update(1, 1, n, st[wh], -ne, 1);
update(1, 1, n, st[x], ne, 1);
upd(1, 1, n, st[pa[wh]], hm);
upd(1, 1, n, st[pa[x]], -hm);
activate(1, 1, n, st[wh], en[wh], -1);
al.push_back(x);
al.push_back(wh);
c0p(x);
c0p(wh);
}
int main(){
f.assign(MAX + 1, 1), inv.assign(MAX + 1, 1);
for (ll i = 2; i <= MAX; i++){
f[i] = (f[i - 1] * i) % mod;
inv[i] = binpow(f[i], mod - 2);
}
int q, r, a, b;
cin>>n>>r;
v.assign(n + 1, vector<int>()), pa.assign(n + 1, 0), emp.assign(n + 1, 0), nee.assign(n + 1, 0);
us.assign(n + 1, -1), st.assign(n + 1, 0), en.assign(n + 1, 0), isz.assign(n + 1, 0);
up.assign(n + 1, vector<int>(20, 0)), act.assign(4 * n + 4, 0), em.assign(4 * n + 4, 0);
for (int i = 0; i < n - 1; i++){
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1, 0);
cin>>q;
nee[1] = r, us[1] = r;
ans = C(n + r - 1, n - 1);
tr.assign(4 * n + 4, 0);
update(1, 1, n, 1, r, 0);
cout<<ans<<"\n";
val.assign(n + 1, 1);
val[1] = ans;
activate(1, 1, n, 1, n, 1);
for (int i = 1; i <= q; i++){
cin>>a;
if (a == 1){
cin>>a>>b;
add(a, b);
}
else{
cin>>a;
del(a);
}
if (ans == 0) while (1) ans++;
if (cnt0 > 0) cout<<0<<"\n";
else{
while (!al.empty()){
recalc(al.back());
al.pop_back();
}
cout<<ans<<"\n";
}
}
}