#include<bits/stdc++.h>
#define int long long
#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
#define pb emplace_back
#define all(a) a.begin(), a.end()
#define task "tree"
using namespace std;
const int maxn = 15e4 + 4, mod = 998244353, blocksize = 450;
int n, q, deg[maxn], lz[maxn], cnt = 0, id[maxn];
vector<int> adj[maxn], heavy, child[maxn], lst[maxn];
int in[maxn], out[maxn], timer = 0, par[maxn], sz[maxn];
void dfseuler(int u, int p) {
in[u] = ++timer;
sz[u] = 1;
for (int v : adj[u]) {
if (v == p) continue;
par[v] = u;
child[u].pb(v);
dfseuler(v, u);
lst[u].pb(in[v]);
sz[u] += sz[v];
}
out[u] = timer;
}
int bit[maxn];
void update(int i, int val) {
for (; i <= n; i += i & -i) bit[i] += val;
}
void update(int l, int r, int val) {
update(l, val);
update(r + 1, -val);
}
int get(int i) {
int ans = 0;
for (; i > 0; i -= i & -i) ans += bit[i];
return ans;
}
inline bool insubtree(int u, int v) {
return (in[u] <= in[v] && out[v] <= out[u]);
}
int pw(int a, int b) {
int ans = 1, cur = a % mod;
while (b) {
if (b & 1) ans = ans * cur % mod;
cur = cur * cur % mod;
b >>= 1;
}
return ans;
}
int getchild(int u, int v) {
int it = upper_bound(lst[u].begin(), lst[u].end(), in[v]) - lst[u].begin() - 1;
return child[u][it];
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
if (fopen(task ".inp", "r")) {
freopen(task ".inp", "r", stdin);
freopen(task ".out", "w", stdout);
}
cin >> n >> q;
for (int u, v, i = 1; i < n; i++) {
cin >> u >> v;
adj[u].pb(v);
adj[v].pb(u);
deg[u]++;
deg[v]++;
}
dfseuler(1, -1);
cnt = 0;
for (int i = 1; i <= n; i++) {
if (deg[i] > blocksize) {
id[i] = ++cnt;
heavy.pb(i);
}
}
while (q--) {
int t, v;
cin >> t >> v;
if (t == 1) {
int d; cin >> d;
if (id[v]) lz[v] += d;
else {
update(in[v], in[v], n * d);
for (int son : adj[v]) {
if (son == par[v]) continue;
update(in[son], (n - sz[son]) * d);
update(out[son] + 1, - (n - sz[son]) * d);
}
update(1, n, sz[v] * d);
update(in[v], out[v], -sz[v] * d);
}
} else {
int ans = get(in[v]);
for (int u : heavy) {
if (u == v) ans += lz[u] * n;
else if (insubtree(u, v)) ans += lz[u] * (n - sz[getchild(u, v)]);
else ans += lz[u] * sz[u];
}
cout << ans % mod * pw(n, mod - 2) % mod << '\n';
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwaWkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBhbGwoYSkgYS5iZWdpbigpLCBhLmVuZCgpCiNkZWZpbmUgdGFzayAidHJlZSIKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtYXhuID0gMTVlNCArIDQsIG1vZCA9IDk5ODI0NDM1MywgYmxvY2tzaXplID0gNDUwOwppbnQgbiwgcSwgZGVnW21heG5dLCBselttYXhuXSwgY250ID0gMCwgaWRbbWF4bl07CnZlY3RvcjxpbnQ+IGFkalttYXhuXSwgaGVhdnksIGNoaWxkW21heG5dLCBsc3RbbWF4bl07CgppbnQgaW5bbWF4bl0sIG91dFttYXhuXSwgdGltZXIgPSAwLCBwYXJbbWF4bl0sIHN6W21heG5dOwp2b2lkIGRmc2V1bGVyKGludCB1LCBpbnQgcCkgewogIGluW3VdID0gKyt0aW1lcjsKICBzelt1XSA9IDE7CiAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgaWYgKHYgPT0gcCkgY29udGludWU7CiAgICBwYXJbdl0gPSB1OwogICAgY2hpbGRbdV0ucGIodik7CiAgICBkZnNldWxlcih2LCB1KTsKICAgIGxzdFt1XS5wYihpblt2XSk7CiAgICBzelt1XSArPSBzelt2XTsKICB9CgogIG91dFt1XSA9IHRpbWVyOwp9CgppbnQgYml0W21heG5dOwp2b2lkIHVwZGF0ZShpbnQgaSwgaW50IHZhbCkgewogIGZvciAoOyBpIDw9IG47IGkgKz0gaSAmIC1pKSBiaXRbaV0gKz0gdmFsOwp9Cgp2b2lkIHVwZGF0ZShpbnQgbCwgaW50IHIsIGludCB2YWwpIHsKICAgdXBkYXRlKGwsIHZhbCk7CiAgIHVwZGF0ZShyICsgMSwgLXZhbCk7Cn0KCmludCBnZXQoaW50IGkpIHsKICBpbnQgYW5zID0gMDsKICBmb3IgKDsgaSA+IDA7IGkgLT0gaSAmIC1pKSBhbnMgKz0gYml0W2ldOwogIHJldHVybiBhbnM7Cn0KCmlubGluZSBib29sIGluc3VidHJlZShpbnQgdSwgaW50IHYpIHsKICByZXR1cm4gKGluW3VdIDw9IGluW3ZdICYmIG91dFt2XSA8PSBvdXRbdV0pOwp9CgppbnQgcHcoaW50IGEsIGludCBiKSB7CiAgaW50IGFucyA9IDEsIGN1ciA9IGEgJSBtb2Q7CiAgd2hpbGUgKGIpIHsKICAgIGlmIChiICYgMSkgYW5zID0gYW5zICogY3VyICUgbW9kOwogICAgY3VyID0gY3VyICogY3VyICUgbW9kOwogICAgYiA+Pj0gMTsKICB9CgogIHJldHVybiBhbnM7Cn0KCmludCBnZXRjaGlsZChpbnQgdSwgaW50IHYpIHsKICBpbnQgaXQgPSB1cHBlcl9ib3VuZChsc3RbdV0uYmVnaW4oKSwgbHN0W3VdLmVuZCgpLCBpblt2XSkgLSBsc3RbdV0uYmVnaW4oKSAtIDE7CiAgcmV0dXJuIGNoaWxkW3VdW2l0XTsKfQoKc2lnbmVkIG1haW4oKSB7CiAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgY2luLnRpZShOVUxMKTsKICBpZiAoZm9wZW4odGFzayAiLmlucCIsICJyIikpIHsKICAgIGZyZW9wZW4odGFzayAiLmlucCIsICJyIiwgc3RkaW4pOwogICAgZnJlb3Blbih0YXNrICIub3V0IiwgInciLCBzdGRvdXQpOwogIH0KCiAgY2luID4+IG4gPj4gcTsKICBmb3IgKGludCB1LCB2LCBpID0gMTsgaSA8IG47IGkrKykgewogICAgY2luID4+IHUgPj4gdjsKICAgIGFkalt1XS5wYih2KTsKICAgIGFkalt2XS5wYih1KTsKICAgIGRlZ1t1XSsrOwogICAgZGVnW3ZdKys7CiAgfQoKICBkZnNldWxlcigxLCAtMSk7CiAgY250ID0gMDsKICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgIGlmIChkZWdbaV0gPiBibG9ja3NpemUpIHsKICAgICAgaWRbaV0gPSArK2NudDsKICAgICAgaGVhdnkucGIoaSk7CiAgICB9CiAgfQoKICB3aGlsZSAocS0tKSB7CiAgICBpbnQgdCwgdjsKICAgIGNpbiA+PiB0ID4+IHY7CiAgICBpZiAodCA9PSAxKSB7CiAgICAgIGludCBkOyBjaW4gPj4gZDsKICAgICAgaWYgKGlkW3ZdKSBselt2XSArPSBkOwogICAgICBlbHNlIHsKICAgICAgICB1cGRhdGUoaW5bdl0sIGluW3ZdLCBuICogZCk7CiAgICAgICAgZm9yIChpbnQgc29uIDogYWRqW3ZdKSB7CiAgICAgICAgICBpZiAoc29uID09IHBhclt2XSkgY29udGludWU7CiAgICAgICAgICB1cGRhdGUoaW5bc29uXSwgKG4gLSBzeltzb25dKSAqIGQpOwogICAgICAgICAgdXBkYXRlKG91dFtzb25dICsgMSwgLSAobiAtIHN6W3Nvbl0pICogZCk7CiAgICAgICAgfQoKICAgICAgICB1cGRhdGUoMSwgbiwgc3pbdl0gKiBkKTsKICAgICAgICB1cGRhdGUoaW5bdl0sIG91dFt2XSwgLXN6W3ZdICogZCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGludCBhbnMgPSBnZXQoaW5bdl0pOwogICAgICBmb3IgKGludCB1IDogaGVhdnkpIHsKICAgICAgICBpZiAodSA9PSB2KSBhbnMgKz0gbHpbdV0gKiBuOwogICAgICAgIGVsc2UgaWYgKGluc3VidHJlZSh1LCB2KSkgYW5zICs9IGx6W3VdICogKG4gLSBzeltnZXRjaGlsZCh1LCB2KV0pOwogICAgICAgIGVsc2UgYW5zICs9IGx6W3VdICogc3pbdV07CiAgICAgIH0KCiAgICAgIGNvdXQgPDwgYW5zICUgbW9kICogcHcobiwgbW9kIC0gMikgJSBtb2QgPDwgJ1xuJzsKICAgIH0KICB9CgogIHJldHVybiAwOwp9CgoK