rt.
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int fa[200005],dep[200005],dfn[200005],rnk[200005],top[200005],sz[200005],hson[200005],cnt;
int h[200005],n,m,u,v,w,a[200005],tot,x,y,tot_;
int tsum[800005],tmax[800005],tmin[800005],lazy[800005];
string op;
struct edge{
int v,c,next;
}e[400005];
struct node{
int u,v;
}idx[200005];
void addedge(int u,int v,int c){
e[++tot]=edge{v,c,h[u]};
h[u]=tot;
}
void dfs1(int u,int f){
fa[u]=f;
sz[u]=1;
hson[u]=-1;
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=f){
dep[e[i].v]=dep[u]+1;
dfs1(e[i].v,u);
sz[u]+=sz[e[i].v];
if(hson[u]==-1||sz[e[i].v]>sz[hson[u]]) hson[u]=e[i].v;
}
}
void dfs2(int u,int t){
dfn[u]=++cnt;
rnk[cnt]=u;
top[u]=t;
if(hson[u]==-1) return;
for(int i=h[u];i;i=e[i].next){
if(e[i].v==fa[u]) continue;
a[e[i].v]=e[i].c;
if(e[i].v==hson[u]) dfs2(e[i].v,t);
else dfs2(e[i].v,e[i].v);
}
}
void build(int node,int l,int r){
if(l==r){
tsum[node]=tmax[node]=tmin[node]=a[rnk[l]];
return;
}
int mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
tsum[node]=tsum[node<<1]+tsum[node<<1|1];
tmax[node]=max(tmax[node<<1],tmax[node<<1|1]);
tmin[node]=min(tmin[node<<1],tmin[node<<1|1]);
}
void pushdown(int node){
if(lazy[node]){
tsum[node<<1]=-tsum[node<<1];
tsum[node<<1|1]=-tsum[node<<1|1];
tmax[node<<1]=-tmax[node<<1];
tmax[node<<1|1]=-tmax[node<<1|1];
tmin[node<<1]=-tmin[node<<1];
tmin[node<<1|1]=-tmin[node<<1|1];
swap(tmin[node<<1],tmax[node<<1]);
swap(tmin[node<<1|1],tmax[node<<1|1]);
lazy[node<<1]=lazy[node<<1]^1;
lazy[node<<1|1]=lazy[node<<1|1]^1;
lazy[node]=0;
}
}
void removeopp(int node,int l,int r,int start,int end){
if(start<=l&&r<=end){
lazy[node]=lazy[node]^1;
tsum[node]=-tsum[node];
tmax[node]=-tmax[node];
tmin[node]=-tmin[node];
swap(tmax[node],tmin[node]);
return;
}
if(start>r||l>end) return;
pushdown(node);
int mid=(l+r)>>1;
removeopp(node<<1,l,mid,start,end);
removeopp(node<<1|1,mid+1,r,start,end);
tsum[node]=tsum[node<<1]+tsum[node<<1|1];
tmax[node]=max(tmax[node<<1],tmax[node<<1|1]);
tmin[node]=min(tmin[node<<1],tmin[node<<1|1]);
}
void change(int node,int l,int r,int id,int d){
if(l==r&&l==id){
tsum[node]=tmax[node]=tmin[node]=d;
lazy[node]=0;
return;
}
pushdown(node);
int mid=(l+r)>>1;
if(id<=mid) change(node<<1,l,mid,id,d);
if(mid<id) change(node<<1|1,mid+1,r,id,d);
tsum[node]=tsum[node<<1]+tsum[node<<1|1];
tmax[node]=max(tmax[node<<1],tmax[node<<1|1]);
tmin[node]=min(tmin[node<<1],tmin[node<<1|1]);
}
int querysum(int node,int l,int r,int start,int end){
if(l>=start&&r<=end) return tsum[node];
if(r<start||l>end) return 0;
int mid=(l+r)>>1;
pushdown(node);
return querysum(node<<1,l,mid,start,end)+querysum(node<<1|1,mid+1,r,start,end);
}
int querymax(int node,int l,int r,int start,int end){
if(l>=start&&r<=end) return tmax[node];
if(r<start||l>end) return -0x3f3f3f3f;
pushdown(node);
int mid=(l+r)>>1;
return max(querymax(node<<1,l,mid,start,end),querymax(node<<1|1,mid+1,r,start,end));
}
int querymin(int node,int l,int r,int start,int end){
if(l>=start&&r<=end) return tmin[node];
if(r<start||l>end) return 0x3f3f3f3f;
pushdown(node);
int mid=(l+r)>>1;
return min(querymin(node<<1,l,mid,start,end),querymin(node<<1|1,mid+1,r,start,end));
}
void updij(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
removeopp(1,1,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
if(u!=v) removeopp(1,1,n,dfn[u]+1,dfn[v]);
}
int qudijsum(int u,int v){
int ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=querysum(1,1,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
if(u!=v) ans+=querysum(1,1,n,dfn[u]+1,dfn[v]);
return ans;
}
int qudijmax(int u,int v){
int ans=-0x3f3f3f3f;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans=max(ans,querymax(1,1,n,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
if(u!=v) ans=max(ans,querymax(1,1,n,dfn[u]+1,dfn[v]));
return ans;
}
int qudijmin(int u,int v){
int ans=0x3f3f3f3f;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans=min(ans,querymin(1,1,n,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
if(u!=v) ans=min(ans,querymin(1,1,n,dfn[u]+1,dfn[v]));
return ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
addedge(u+1,v+1,w),addedge(v+1,u+1,w);
idx[++tot_]=node{u+1,v+1};
}
scanf("%d",&m);
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
while(m--){
cin>>op;
if(op=="C"){
scanf("%d%d",&x,&y);
int tmp;
if(dep[idx[x].u]<dep[idx[x].v]) tmp=idx[x].v;
else tmp=idx[x].u;
change(1,1,n,dfn[tmp],y);
}else if(op=="N"){
scanf("%d%d",&x,&y);
updij(x+1,y+1);
}else if(op=="SUM"){
scanf("%d%d",&x,&y);
printf("%d\n",qudijsum(x+1,y+1));
}else if(op=="MAX"){
scanf("%d%d",&x,&y);
printf("%d\n",qudijmax(x+1,y+1));
}else{
scanf("%d%d",&x,&y);
printf("%d\n",qudijmin(x+1,y+1));
}
}
return 0;
}