#include <bits/stdc++.h>
#define ls(a) a<<1
#define rs(a) a<<1|1
using namespace std;
const int N=2e5+3,inf=1e9;
vector<int>v[N];
struct node{
int x,mn,mx,lzy;
}sum[N<<2];
int n,siz[N],dfn[N],_,top[N],cnt=-1,f[N],s[N],x[N],y[N],w[N],deep[N],a[N];
string str;
void dfs1(int u,int fa){
f[u]=fa,siz[u]=1;
for(int i:v[u]) if(i!=fa){
deep[i]=deep[u]+1;
dfs1(i,u);
siz[u]+=siz[i];
}
}
void dfs(int u){
if(top[u]==-1) top[u]=u;
dfn[u]=++cnt;
int op=-1;
for(int i:v[u]) if(i!=f[u])
if(op==-1||siz[i]>siz[op]) op=i;
if(op!=-1){
top[op]=top[u];
dfs(op);
}
for(int i:v[u])
if(i!=f[u]&&i!=op) dfs(i);
}
void up(int rt){
int l=ls(rt),r=rs(rt);
sum[rt].x=sum[l].x+sum[r].x,
sum[rt].mx=max(sum[l].mx,sum[r].mx),
sum[rt].mn=min(sum[l].mn,sum[r].mn);
}
void pd(int rt){
if(sum[rt].lzy){
int l=ls(rt),r=rs(rt);
sum[rt].lzy=0;
sum[l]=node{-sum[l].x,-sum[l].mx,-sum[l].mn,sum[l].lzy^1},
sum[r]=node{-sum[r].x,-sum[r].mx,-sum[r].mn,sum[r].lzy^1};
}
}
void build(int rt,int l,int r){
if(l==r){sum[rt]=node{a[l],a[l],a[l],0};return;}
int mid=(l+r)>>1;
build(ls(rt),l,mid);build(rs(rt),mid+1,r);
up(rt);
}
void change(int rt,int l,int r,int k,int v){
if(l==r){sum[rt]=node{v,v,v,0};return;}
int mid=(l+r)>>1;
pd(rt);
if(k<=mid) change(ls(rt),l,mid,k,v);
else change(rs(rt),mid+1,r,k,v);
up(rt);
}
void changeot(int x,int v){
change(1,1,n,dfn[s[x]],v);
}
void change1(int rt,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
sum[rt]=node{-sum[rt].x,-sum[rt].mx,-sum[rt].mn,sum[rt].lzy^1};
return;
}
pd(rt);
int mid=(l+r)>>1;
if(ql<=mid) change1(ls(rt),l,mid,ql,qr);
if(mid<qr) change1(rs(rt),mid+1,r,ql,qr);
up(rt);
}
void Not(int u,int v){
while(top[u]!=top[v]){
if(deep[top[u]]<deep[top[v]]) swap(u,v);
change1(1,1,n,dfn[top[u]],dfn[u]);
u=f[top[u]];
}
if(deep[u]<deep[v]) swap(u,v);
if(u!=v) change1(1,1,n,dfn[v]+1,dfn[u]);
}
int qsum(int rt,int l,int r,int ql,int qr){
if(l==r) return sum[rt].x;
pd(rt);
int mid=(l+r)>>1,cnt=0;
if(ql<=mid) cnt=qsum(ls(rt),l,mid,ql,qr);
if(mid<qr) cnt+=qsum(rs(rt),mid+1,r,ql,qr);
up(rt);
return cnt;
}
int qsumot(int u,int v){
int cnt=0;
while(top[u]!=top[v]){
if(deep[top[u]]<deep[top[v]]) swap(u,v);
cnt+=qsum(1,1,n,dfn[top[u]],dfn[u]);
u=f[top[u]];
}
if(deep[u]<deep[v]) swap(u,v);
if(u!=v) cnt+=qsum(1,1,n,dfn[v]+1,dfn[u]);
return cnt;
}
int qmn(int rt,int l,int r,int ql,int qr){
if(l==r) return sum[rt].mn;
pd(rt);
int mid=(l+r)>>1,cnt=inf;
if(ql<=mid) cnt=qmn(ls(rt),l,mid,ql,qr);
if(mid<qr) cnt=min(cnt,qmn(rs(rt),mid+1,r,ql,qr));
up(rt);
return cnt;
}
int qmnot(int u,int v){
int cnt=inf;
while(top[u]!=top[v]){
if(deep[top[u]]<deep[top[v]]) swap(u,v);
cnt=min(cnt,qmn(1,1,n,dfn[top[u]],dfn[u]));
u=f[top[u]];
}
if(deep[u]<deep[v]) swap(u,v);
if(u!=v) cnt=min(cnt,qmn(1,1,n,dfn[v]+1,dfn[u]));
return cnt;
}
int qmx(int rt,int l,int r,int ql,int qr){
if(l==r) return sum[rt].mx;
pd(rt);
int mid=(l+r)>>1,cnt=-inf;
if(ql<=mid) cnt=qmx(ls(rt),l,mid,ql,qr);
if(mid<qr) cnt=max(cnt,qmx(rs(rt),mid+1,r,ql,qr));
up(rt);
return cnt;
}
int qmxot(int u,int v){
int cnt=-inf;
while(top[u]!=top[v]){
if(deep[top[u]]<deep[top[v]]) swap(u,v);
cnt=max(cnt,qmx(1,1,n,dfn[top[u]],dfn[u]));
u=f[top[u]];
}
if(deep[u]<deep[v]) swap(u,v);
if(u!=v) cnt=max(cnt,qmx(1,1,n,dfn[v]+1,dfn[u]));
return cnt;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;deep[0]=1,n--;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>w[i];
v[x[i]].push_back(y[i]);
v[y[i]].push_back(x[i]);
}
for(int i=0;i<=n;i++) top[i]=-1;
dfs1(0,-1);
dfs(0);
for(int i=1;i<=n;i++)
a[dfn[s[i]=(deep[x[i]]==deep[y[i]]+1?x[i]:y[i])]]=w[i];
build(1,1,n);
int u,v;
cin>>_;
while(_--){
cin>>str>>u>>v;
if(str=="C") changeot(u,v);
if(str=="N") Not(u,v);
if(str=="SUM") cout<<qsumot(u,v)<<"\n";
if(str=="MAX") cout<<qmxot(u,v)<<"\n";
if(str=="MIN") cout<<qmnot(u,v)<<"\n";
}
return 0;
}