#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=4e5+10;
LL h[N],e[N],ne[N],idx;
LL f[N],w[N];
LL sz[N],top[N],dep[N],son[N],fa[N];
LL id[N],cnt,nw[N];
void add(int a,int b,LL c){
e[idx]=b,ne[idx]=h[a],f[idx]=c,h[a]=idx++;
}
struct node{
int l,r;
LL m,mi,sum,x;
}tr[N*4];
void pushup(int u){
tr[u].m=max(tr[u<<1].m,tr[u<<1|1].m);
tr[u].mi=min(tr[u<<1].mi,tr[u<<1|1].mi);
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(int u){
if(tr[u].x){
tr[u<<1].sum=-tr[u<<1].sum;
tr[u<<1|1].sum=-tr[u<<1|1].sum;
tr[u<<1].m=-tr[u<<1].m;
tr[u<<1].mi=-tr[u<<1].mi;
swap(tr[u<<1].m,tr[u<<1].mi);
tr[u<<1|1].m=-tr[u<<1|1].m;
tr[u<<1|1].mi=-tr[u<<1|1].mi;
swap(tr[u<<1|1].mi,tr[u<<1|1].m);
tr[u<<1].x^=1;
tr[u<<1|1].x^=1;
tr[u].x=0;
}
}
void build(int u,int l,int r){
tr[u]={l,r,nw[r],nw[r],nw[r],0};
if(l==r)return;
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
LL querymax(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].m;
}
pushdown(u);
LL res=-1e9;
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)res=max(res,querymax(u<<1,l,r));
if(r>mid)res=max(res,querymax(u<<1|1,l,r));
return res;
}
LL querysum(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].sum;
}
LL res=0;
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)res+=querysum(u<<1,l,r);
if(r>mid)res+=querysum(u<<1|1,l,r);
return res;
}
LL querymin(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].mi;
}
LL res=1e9;
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)res=min(res,querymin(u<<1,l,r));
if(r>mid)res=min(res,querymin(u<<1|1,l,r));
return res;
}
void modify(int u,int l,int r,LL k){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].m=tr[u].mi=tr[u].sum=k;
return;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)modify(u<<1,l,r,k);
if(r>mid)modify(u<<1|1,l,r,k);
pushup(u);
}
void xorr(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].m=-tr[u].m;
tr[u].mi=-tr[u].mi;
swap(tr[u].m,tr[u].mi);
tr[u].sum=-tr[u].sum;
tr[u].x^=1;
return;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)xorr(u<<1,l,r);
if(r>mid)xorr(u<<1|1,l,r);
pushup(u);
}
void dfs_son(int u,int father,int d){
dep[u]=d,fa[u]=father,sz[u]=1;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==father)continue;
w[j]=f[i];
dfs_son(j,u,d+1);
sz[u]+=sz[j];
if(sz[son[u]]<sz[j])son[u]=j;
}
}
void dfs(int u,int t){
id[u]=++cnt,nw[cnt]=w[u],top[u]=t;
if(!son[u])return;
dfs(son[u],t);
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==son[u]||j==fa[u])continue;
dfs(j,j);
}
}
LL query_path_max(int u,int v){
LL res=-1e9;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
res=max(res,querymax(1,id[top[u]],id[u]));
u=fa[top[u]];
}
if(u==v)return res;
if(dep[u]<dep[v])swap(u,v);
res=max(res,querymax(1,id[v]+1,id[u]));
return res;
}
LL query_path_min(int u,int v){
LL res=1e9;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
res=min(res,querymin(1,id[top[u]],id[u]));
u=fa[top[u]];
}
if(u==v)return res;
if(dep[u]<dep[v])swap(u,v);
res=min(res,querymin(1,id[v]+1,id[u]));
return res;
}
LL query_path_sum(int u,int v){
LL res=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
res+=querysum(1,id[top[u]],id[u]);
u=fa[top[u]];
}
if(u==v)return res;
if(dep[u]<dep[v])swap(u,v);
res+=querysum(1,id[v]+1,id[u]);
return res;
}
void change(int u,int v,LL k){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
modify(1,id[top[u]],id[u],k);
u=fa[top[u]];
}
if(u==v)return;
if(dep[u]<dep[v])swap(u,v);
modify(1,id[v]+1,id[u],k);
}
void xor_path(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
xorr(1,id[top[u]],id[u]);
u=fa[top[u]];
}
if(u==v)return;
if(dep[u]<dep[v])swap(u,v);
xorr(1,id[v]+1,id[u]);
}
int main(){
memset(h,-1,sizeof h);
int n;
cin>>n;
for(int i=1;i<n;i++){
LL a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
dfs_son(1,-1,1);
dfs(1,1);
build(1,1,n);
int m;
cin>>m;
while(m--){
string a;
cin>>a;
if(a=="C"){
int x,k;
cin>>x>>k;
int u=e[x*2-1],v=e[(x*2-1)^1];
if(fa[u]!=v)swap(u,v);
change(v,u,k);
}
if(a=="MAX"){
int u,v;
cin>>u>>v;
cout<<query_path_max(u,v)<<endl;
}
if(a=="SUM"){
int u,v;
cin>>u>>v;
cout<<query_path_sum(u,v)<<endl;
}
if(a=="MIN"){
int u,v;
cin>>u>>v;
cout<<query_path_min(u,v)<<endl;
}
if(a=="N"){
int u,v;
cin>>u>>v;
xor_path(u,v);
}
}
return 0;
}