#include <iostream>
#include <vector>
using namespace std;
const int N = 1<<18;
vector<int> nei[N], Op[N];
int Par[N];
void dfs(int u, int p){
Op[u].resize(42, 1);
Par[u] = p;
for (int i : nei[u]){
if (i != p)
dfs(i, u);
}
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n, L, q;
cin>>n>>L;
for (int i=1;i<n;i++){
int a, b;
cin>>a>>b;
nei[a].push_back(b);
nei[b].push_back(a);
}
dfs(1, 0);
for (int i=1;i<=n;i++)
cin>>Op[i][0];
cin>>q;
for (int i=1;i<=q;i++){
int t, v, d = 0, w, Ans = 1;
cin>>t>>v;
if (t == 1){
cin>>d>>w;
while (d + 1 and v){
Op[v][d] = 1LL * Op[v][d] * w % L;
d--, v = Par[v];
}
}
else{
while (v > 1 and d <= 40){
Ans = 1LL * Ans * Op[v][d] % L * Op[v][d+1] % L;
v = Par[v], d++;
}
for (; d <= 40; d++)
Ans = 1LL * Ans * Op[1][d] % L;
cout<<Ans<<'\n';
}
}
}