#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+IGIpewoJCQlhID0gYjsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KIAp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPgoJYm9vbCBtYXhpbWl6ZShYICZhICwgWSBiKXsKCQlpZihhIDwgYil7CgkJCWEgPSBiOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQogCnZvaWQgSHV1VGhpZW4oKXsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCWlmKGZvcGVuKEZOQU1FIi5pbnAiLCJyIikpewoJCWZyZW9wZW4oRk5BTUUiLmlucCIsInIiLHN0ZGluKTsKCQlmcmVvcGVuKEZOQU1FIi5vdXQiLCJ3IixzdGRvdXQpOwoJfQp9CgpzdHJ1Y3QgU3RhdGV7CglpbnQgdSwgdjsKCWxvbmcgbG9uZyB3Owp9OwoKdmVjdG9yPGludD4gYWRqW01BWE5dOwppbnQgbiwgcTsKaW50IHBhcmVudFtNQVhOXSwgU2l6ZVtNQVhOXSwgaGVhdnlbTUFYTl07CmludCBwb3NbTUFYTl0sIGJhc2VbTUFYTl0sIGRlcHRoW01BWE5dLCBoZWFkW01BWE5dLCB0aW1lREZTID0gMDsKdmVjdG9yPFN0YXRlPiBlZGdlczsKCnZvaWQgZGZzKGludCB1LCBpbnQgcGFyKSB7CglTaXplW3VdID0gMTsKCWhlYXZ5W3VdID0gLTE7CglwYXJlbnRbdV0gPSBwYXI7CglkZXB0aFt1XSA9IChwYXIgPT0gLTEgPyAwIDogZGVwdGhbcGFyXSArIDEpOwoJaW50IG1heG5vZGUgPSAwOwoKCWZvcihpbnQgdiA6IGFkalt1XSkgaWYodiAhPSBwYXIpIHsKCQlkZnModiwgdSk7CgkJU2l6ZVt1XSArPSBTaXplW3ZdOwoJCWlmKG1heGltaXplKG1heG5vZGUsIFNpemVbdl0pKSB7CgkJCWhlYXZ5W3VdID0gdjsKCQl9Cgl9Cn0KCnZvaWQgSExEKGludCB1LCBpbnQgaCkgewoJaGVhZFt1XSA9IGg7Cglwb3NbdV0gPSArK3RpbWVERlM7CgoJaWYoaGVhdnlbdV0gIT0gLTEpIHsKCQlITEQoaGVhdnlbdV0sIGgpOwoJfQoKCWZvcihpbnQgdiA6IGFkalt1XSkgewoJCWlmKHYgPT0gcGFyZW50W3VdIHx8IHYgPT0gaGVhdnlbdV0pIGNvbnRpbnVlOwoJCUhMRCh2LCB2KTsKCX0KfQoKbmFtZXNwYWNlIFNlZ21lbnRUcmVlewoJdmVjdG9yPGxvbmcgbG9uZz4gU2VnVHJlZSg0ICogTUFYTiwgMCk7CgoJdm9pZCBVcGRhdGUoaW50IG5vZGUsIGludCBsLCBpbnQgciwgaW50IHBzLCBsb25nIGxvbmcgdmFsKSB7CgkJaWYobCA9PSByKSB7CgkJCVNlZ1RyZWVbbm9kZV0gPSB2YWw7CgkJCXJldHVybjsKCQl9CgoJCWludCBtaWQgPSAobCArIHIpIC8gMjsKCQlpZihwcyA8PSBtaWQpIHsKCQkJVXBkYXRlKDIgKiBub2RlLCBsLCBtaWQsIHBzLCB2YWwpOwoJCX0gZWxzZSB7CgkJCVVwZGF0ZSgyICogbm9kZSArIDEsIG1pZCArIDEsIHIsIHBzLCB2YWwpOwoJCX0KCgkJU2VnVHJlZVtub2RlXSA9IFNlZ1RyZWVbMiAqIG5vZGVdICsgU2VnVHJlZVsyICogbm9kZSArIDFdOwoJfQoKCWxvbmcgbG9uZyBnZXRBbnMoaW50IG5vZGUsIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIpIHsKCQlpZihsID4gcXIgfHwgciA8IHFsKSByZXR1cm4gMGxsOwoJCWlmKHFsIDw9IGwgJiYgciA8PSBxcikgcmV0dXJuIFNlZ1RyZWVbbm9kZV07CgkJaW50IG1pZCA9IChsICsgcikgLyAyOwoJCWxvbmcgbG9uZyBzMSA9IGdldEFucygyICogbm9kZSwgbCwgbWlkLCBxbCwgcXIpOwoJCWxvbmcgbG9uZyBzMiA9IGdldEFucygyICogbm9kZSArIDEsIG1pZCArIDEsIHIsIHFsLCBxcik7CgkJcmV0dXJuIHMxICsgczI7Cgl9Cn0KCmxvbmcgbG9uZyBTdW1MZW5ndGgoaW50IHUsIGludCB2KSB7Cglsb25nIGxvbmcgYW5zID0gMDsKCXdoaWxlKGhlYWRbdV0gIT0gaGVhZFt2XSkgewoJCWlmKGRlcHRoW2hlYWRbdV1dIDwgZGVwdGhbaGVhZFt2XV0pIHN3YXAodSwgdik7CgkJYW5zICs9IFNlZ21lbnRUcmVlOjpnZXRBbnMoMSwgMSwgbiwgcG9zW2hlYWRbdV1dLCBwb3NbdV0pOwoJCXUgPSBwYXJlbnRbaGVhZFt1XV07CiAJfQkKCglpZih1ICE9IHYpIHsKCQlpZihkZXB0aFt1XSA+IGRlcHRoW3ZdKSBzd2FwKHUsIHYpOwoJCWFucyArPSBTZWdtZW50VHJlZTo6Z2V0QW5zKDEsIDEsIG4sIHBvc1t1XSArIDEsIHBvc1t2XSk7Cgl9CgoJcmV0dXJuIGFuczsKfQoKdm9pZCBJbml0KCkgewoJY2luID4+IG47CgoJZm9yKGludCBpID0gMTsgaSA8PSBuIC0gMTsgaSsrKSB7CgkJaW50IHUsIHY7CgkJbG9uZyBsb25nIHc7CgkJY2luID4+IHUgPj4gdiA+PiB3OwoJCWFkalt1XS5wdXNoX2JhY2sodik7CgkJYWRqW3ZdLnB1c2hfYmFjayh1KTsKCQllZGdlcy5wdXNoX2JhY2soe3UsIHYsIHd9KTsKCX0KCglkZnMoMSwgLTEpOwoJSExEKDEsIDEpOwoKCWZvcihpbnQgaSA9IDA7IGkgPCBuIC0gMSA7IGkrKykgewoJCVN0YXRlIGUgPSBlZGdlc1tpXTsKCQlpbnQgdSA9IGUudSwgdiA9IGUudjsKCQlsb25nIGxvbmcgd3QgPSBlLnc7CgkJaWYocGFyZW50W3VdID09IHYpIHN3YXAodSwgdik7CgkJU2VnbWVudFRyZWU6OlVwZGF0ZSgxLCAxLCBuLCBwb3Nbdl0sIHd0KTsKCX0KfSAKCnZvaWQgU29sdmUoKSB7CgljaW4gPj4gcTsKCXdoaWxlKHEtLSkgewoJCWludCB0eXBlOwoJCWNpbiA+PiB0eXBlOwoJCWlmKHR5cGUgPT0gMSkgewoJCQlpbnQgcHM7IGxvbmcgbG9uZyB3OwoJCQljaW4gPj4gcHMgPj4gdzsKCQkJcHMtLTsKCQkJU3RhdGUgZSA9IGVkZ2VzW3BzXTsKCQkJaW50IHUgPSBlLnUsIHYgPSBlLnY7CgkJCWlmKHBhcmVudFt1XSA9PSB2KSBzd2FwKHUsIHYpOwoJCQlTZWdtZW50VHJlZTo6VXBkYXRlKDEsIDEsIG4sIHBvc1t2XSwgdyk7IAoJCX0gZWxzZSB7CgkJCWludCB1LCB2OwoJCQljaW4gPj4gdSA+PiB2OwoJCQljb3V0IDw8IFN1bUxlbmd0aCh1LCB2KSA8PCB4ZDsKCQl9Cgl9Cn0KCnNpZ25lZCBtYWluKCl7CglIdXVUaGllbigpOwkKCWludCB0ZXN0ID0gMTsKCXdoaWxlKHRlc3QtLSl7CgkJSW5pdCgpOwoJCVNvbHZlKCk7Cgl9Cn0K