#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define FNAME "DIST"
#define xd "\n"
using namespace std;
const int MAXN = (int)2e5 + 10;
const int INF = (int)3e5 + 1;
const long long MOD = (long long)1e9 + 7;
template<class X, class Y>
bool minimize(X &a , Y b){
if(a > b){
a = b;
return true;
}
return false;
}
template<class X, class Y>
bool maximize(X &a , Y b){
if(a < b){
a = b;
return true;
}
return false;
}
void HuuThien(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if(fopen(FNAME".inp","r")){
freopen(FNAME".inp","r",stdin);
freopen(FNAME".out","w",stdout);
}
}
struct State{
int u, v;
long long w;
};
vector<int> adj[MAXN];
int n, q;
int parent[MAXN], Size[MAXN], heavy[MAXN];
int pos[MAXN], base[MAXN], depth[MAXN], head[MAXN], timeDFS = 0;
vector<State> edges;
void dfs(int u, int par) {
Size[u] = 1;
heavy[u] = -1;
parent[u] = par;
depth[u] = (par == -1 ? 0 : depth[par] + 1);
int maxnode = 0;
for(int v : adj[u]) if(v ^ par) {
dfs(v, u);
Size[u] += Size[v];
if(maximize(maxnode, Size[v])) {
heavy[u] = v;
}
}
}
void HLD(int u, int h) {
head[u] = h;
pos[u] = ++timeDFS;
if(heavy[u] != -1) {
HLD(heavy[u], h);
}
for(int v : adj[u]) {
if(v == parent[u] || v == heavy[u]) continue;
HLD(v, v);
}
}
namespace SegmentTree{
vector<long long> SegTree(4 * MAXN, 0);
void Update(int node, int l, int r, int ps, long long val) {
if(l == r) {
SegTree[node] = val;
return;
}
int mid = (l + r) / 2;
if(ps <= mid) {
Update(2 * node, l, mid, ps, val);
} else {
Update(2 * node + 1, mid + 1, r, ps, val);
}
SegTree[node] = SegTree[2 * node] + SegTree[2 * node + 1];
}
long long getAns(int node, int l, int r, int ql, int qr) {
if(l > qr || r < ql) return 0ll;
if(ql <= l && r <= qr) return SegTree[node];
int mid = (l + r) / 2;
long long s1 = getAns(2 * node, l, mid, ql, qr);
long long s2 = getAns(2 * node + 1, mid + 1, r, ql, qr);
return s1 + s2;
}
}
long long SumLength(int u, int v) {
long long ans = 0;
while(head[u] != head[v]) {
if(depth[head[u]] < depth[head[v]]) swap(u, v);
ans += SegmentTree::getAns(1, 1, n, pos[head[u]], pos[u]);
u = parent[head[u]];
}
if(u ^ v) {
if(depth[u] > depth[v]) swap(u, v);
ans += SegmentTree::getAns(1, 1, n, pos[u] + 1, pos[v]);
}
return ans;
}
void Init() {
cin >> n;
for(int i = 1; i <= n - 1; i++) {
int u, v;
long long w;
cin >> u >> v >> w;
adj[u].push_back(v);
adj[v].push_back(u);
edges.push_back({u, v, w});
}
dfs(1, -1);
HLD(1, 1);
for(int i = 0; i < n - 1 ; i++) {
State e = edges[i];
int u = e.u, v = e.v;
long long wt = e.w;
if(parent[u] == v) swap(u, v);
SegmentTree::Update(1, 1, n, pos[v], wt);
}
}
void Solve() {
cin >> q;
while(q--) {
int type;
cin >> type;
if(type == 1) {
int ps; long long w;
cin >> ps >> w;
ps--;
State e = edges[ps];
int u = e.u, v = e.v;
if(parent[u] == v) swap(u, v);
SegmentTree::Update(1, 1, n, pos[v], w);
} else {
int u, v;
cin >> u >> v;
cout << SumLength(u, v) << xd;
}
}
}
signed main(){
HuuThien();
int test = 1;
while(test--){
Init();
Solve();
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgRk5BTUUgIkRJU1QiCiNkZWZpbmUgeGQgIlxuIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgTUFYTiA9IChpbnQpMmU1ICsgMTA7CmNvbnN0IGludCBJTkYgPSAoaW50KTNlNSArIDE7CmNvbnN0IGxvbmcgbG9uZyBNT0QgPSAobG9uZyBsb25nKTFlOSArIDc7CiAKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4KCWJvb2wgbWluaW1pemUoWCAmYSAsIFkgYil7CgkJaWYoYSA+IGIpewoJCQlhID0gYjsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KIAp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPgoJYm9vbCBtYXhpbWl6ZShYICZhICwgWSBiKXsKCQlpZihhIDwgYil7CgkJCWEgPSBiOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQogCnZvaWQgSHV1VGhpZW4oKXsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCWlmKGZvcGVuKEZOQU1FIi5pbnAiLCJyIikpewoJCWZyZW9wZW4oRk5BTUUiLmlucCIsInIiLHN0ZGluKTsKCQlmcmVvcGVuKEZOQU1FIi5vdXQiLCJ3IixzdGRvdXQpOwoJfQp9CgpzdHJ1Y3QgU3RhdGV7CglpbnQgdSwgdjsKCWxvbmcgbG9uZyB3Owp9OwoKdmVjdG9yPGludD4gYWRqW01BWE5dOwppbnQgbiwgcTsKaW50IHBhcmVudFtNQVhOXSwgU2l6ZVtNQVhOXSwgaGVhdnlbTUFYTl07CmludCBwb3NbTUFYTl0sIGJhc2VbTUFYTl0sIGRlcHRoW01BWE5dLCBoZWFkW01BWE5dLCB0aW1lREZTID0gMDsKdmVjdG9yPFN0YXRlPiBlZGdlczsKCnZvaWQgZGZzKGludCB1LCBpbnQgcGFyKSB7CglTaXplW3VdID0gMTsKCWhlYXZ5W3VdID0gLTE7CglwYXJlbnRbdV0gPSBwYXI7CglkZXB0aFt1XSA9IChwYXIgPT0gLTEgPyAwIDogZGVwdGhbcGFyXSArIDEpOwoJaW50IG1heG5vZGUgPSAwOwoKCWZvcihpbnQgdiA6IGFkalt1XSkgaWYodiBeIHBhcikgewoJCWRmcyh2LCB1KTsKCQlTaXplW3VdICs9IFNpemVbdl07CgkJaWYobWF4aW1pemUobWF4bm9kZSwgU2l6ZVt2XSkpIHsKCQkJaGVhdnlbdV0gPSB2OwoJCX0KCX0KfQoKdm9pZCBITEQoaW50IHUsIGludCBoKSB7CgloZWFkW3VdID0gaDsKCXBvc1t1XSA9ICsrdGltZURGUzsKCglpZihoZWF2eVt1XSAhPSAtMSkgewoJCUhMRChoZWF2eVt1XSwgaCk7Cgl9CgoJZm9yKGludCB2IDogYWRqW3VdKSB7CgkJaWYodiA9PSBwYXJlbnRbdV0gfHwgdiA9PSBoZWF2eVt1XSkgY29udGludWU7CgkJSExEKHYsIHYpOwoJfQp9CgpuYW1lc3BhY2UgU2VnbWVudFRyZWV7Cgl2ZWN0b3I8bG9uZyBsb25nPiBTZWdUcmVlKDQgKiBNQVhOLCAwKTsKCgl2b2lkIFVwZGF0ZShpbnQgbm9kZSwgaW50IGwsIGludCByLCBpbnQgcHMsIGxvbmcgbG9uZyB2YWwpIHsKCQlpZihsID09IHIpIHsKCQkJU2VnVHJlZVtub2RlXSA9IHZhbDsKCQkJcmV0dXJuOwoJCX0KCgkJaW50IG1pZCA9IChsICsgcikgLyAyOwoJCWlmKHBzIDw9IG1pZCkgewoJCQlVcGRhdGUoMiAqIG5vZGUsIGwsIG1pZCwgcHMsIHZhbCk7CgkJfSBlbHNlIHsKCQkJVXBkYXRlKDIgKiBub2RlICsgMSwgbWlkICsgMSwgciwgcHMsIHZhbCk7CgkJfQoKCQlTZWdUcmVlW25vZGVdID0gU2VnVHJlZVsyICogbm9kZV0gKyBTZWdUcmVlWzIgKiBub2RlICsgMV07Cgl9CgoJbG9uZyBsb25nIGdldEFucyhpbnQgbm9kZSwgaW50IGwsIGludCByLCBpbnQgcWwsIGludCBxcikgewoJCWlmKGwgPiBxciB8fCByIDwgcWwpIHJldHVybiAwbGw7CgkJaWYocWwgPD0gbCAmJiByIDw9IHFyKSByZXR1cm4gU2VnVHJlZVtub2RlXTsKCQlpbnQgbWlkID0gKGwgKyByKSAvIDI7CgkJbG9uZyBsb25nIHMxID0gZ2V0QW5zKDIgKiBub2RlLCBsLCBtaWQsIHFsLCBxcik7CgkJbG9uZyBsb25nIHMyID0gZ2V0QW5zKDIgKiBub2RlICsgMSwgbWlkICsgMSwgciwgcWwsIHFyKTsKCQlyZXR1cm4gczEgKyBzMjsKCX0KfQoKbG9uZyBsb25nIFN1bUxlbmd0aChpbnQgdSwgaW50IHYpIHsKCWxvbmcgbG9uZyBhbnMgPSAwOwoJd2hpbGUoaGVhZFt1XSAhPSBoZWFkW3ZdKSB7CgkJaWYoZGVwdGhbaGVhZFt1XV0gPCBkZXB0aFtoZWFkW3ZdXSkgc3dhcCh1LCB2KTsKCQlhbnMgKz0gU2VnbWVudFRyZWU6OmdldEFucygxLCAxLCBuLCBwb3NbaGVhZFt1XV0sIHBvc1t1XSk7CgkJdSA9IHBhcmVudFtoZWFkW3VdXTsKIAl9CQoKCWlmKHUgXiB2KSB7CgkJaWYoZGVwdGhbdV0gPiBkZXB0aFt2XSkgc3dhcCh1LCB2KTsKCQlhbnMgKz0gU2VnbWVudFRyZWU6OmdldEFucygxLCAxLCBuLCBwb3NbdV0gKyAxLCBwb3Nbdl0pOwoJfQoKCXJldHVybiBhbnM7Cn0KCnZvaWQgSW5pdCgpIHsKCWNpbiA+PiBuOwoKCWZvcihpbnQgaSA9IDE7IGkgPD0gbiAtIDE7IGkrKykgewoJCWludCB1LCB2OwoJCWxvbmcgbG9uZyB3OwoJCWNpbiA+PiB1ID4+IHYgPj4gdzsKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOwoJCWFkalt2XS5wdXNoX2JhY2sodSk7CgkJZWRnZXMucHVzaF9iYWNrKHt1LCB2LCB3fSk7Cgl9CgoJZGZzKDEsIC0xKTsKCUhMRCgxLCAxKTsKCglmb3IoaW50IGkgPSAwOyBpIDwgbiAtIDEgOyBpKyspIHsKCQlTdGF0ZSBlID0gZWRnZXNbaV07CgkJaW50IHUgPSBlLnUsIHYgPSBlLnY7CgkJbG9uZyBsb25nIHd0ID0gZS53OwoJCWlmKHBhcmVudFt1XSA9PSB2KSBzd2FwKHUsIHYpOwoJCVNlZ21lbnRUcmVlOjpVcGRhdGUoMSwgMSwgbiwgcG9zW3ZdLCB3dCk7Cgl9Cn0gCgp2b2lkIFNvbHZlKCkgewoJY2luID4+IHE7Cgl3aGlsZShxLS0pIHsKCQlpbnQgdHlwZTsKCQljaW4gPj4gdHlwZTsKCQlpZih0eXBlID09IDEpIHsKCQkJaW50IHBzOyBsb25nIGxvbmcgdzsKCQkJY2luID4+IHBzID4+IHc7CgkJCXBzLS07CgkJCVN0YXRlIGUgPSBlZGdlc1twc107CgkJCWludCB1ID0gZS51LCB2ID0gZS52OwoJCQlpZihwYXJlbnRbdV0gPT0gdikgc3dhcCh1LCB2KTsKCQkJU2VnbWVudFRyZWU6OlVwZGF0ZSgxLCAxLCBuLCBwb3Nbdl0sIHcpOyAKCQl9IGVsc2UgewoJCQlpbnQgdSwgdjsKCQkJY2luID4+IHUgPj4gdjsKCQkJY291dCA8PCBTdW1MZW5ndGgodSwgdikgPDwgeGQ7CgkJfQoJfQp9CgpzaWduZWQgbWFpbigpewoJSHV1VGhpZW4oKTsJCglpbnQgdGVzdCA9IDE7Cgl3aGlsZSh0ZXN0LS0pewoJCUluaXQoKTsKCQlTb2x2ZSgpOwoJfQp9Cg==