#include <bits/stdc++.h>
using i64 = long long;
#ifdef DEBUG
#include "debug.h"
#else
#define debug(...) void(23)
#endif
constexpr int K = 41;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int N, L;
std::cin >> N >> L;
std::vector<std::vector<int>> adj(N);
for (int i = 1; i < N; ++i) {
int A, B;
std::cin >> A >> B;
--A, --B;
adj[A].emplace_back(B);
adj[B].emplace_back(A);
}
std::vector<i64> H(N);
for (int i = 0; i < N; ++i) {
std::cin >> H[i];
}
std::vector<int> par(N, -1);
auto dfs = [&](auto&& self, int v) -> void {
for (auto u : adj[v]) {
adj[u].erase(std::find(adj[u].begin(), adj[u].end(), v));
par[u] = v;
self(self, u);
}
};
dfs(dfs, 0);
std::vector<std::array<i64, K>> wei(N);
for (int i = 0; i < N; ++i) {
for (int j = 0; j < K; ++j) {
wei[i][j] = 1;
}
}
auto mul = [&](i64 a, i64 b) -> i64 {
return (a * b) % L;
};
int Q;
std::cin >> Q;
while (Q--) {
int TP;
std::cin >> TP;
if (TP == 1) {
int X, D, W;
std::cin >> X >> D >> W;
--X;
while (X != 0 && D >= 0) {
wei[X][D] = mul(wei[X][D], W);
if (--D == -1) {
break;
} else if (X == 0) {
break;
} else {
wei[X][D] = mul(wei[X][D], W);
X = par[X];
}
}
while (D >= 0) {
wei[X][D] = mul(wei[X][D], W);
D--;
}
} else {
int X;
std::cin >> X;
--X;
i64 ans = H[X];
for (int i = 0; X != -1 && i < K; ++i, X = par[X]) {
ans = mul(ans, wei[X][i]);
}
std::cout << ans << '\n';
}
// #ifdef DEBUG
// for (int i = 0; i < N; ++i) {
// debug(i, wei[i]);
// }
// debug();
// #endif
}
return 0;
}