#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[200005],x,y,z,head[200005],cnt0=0,p[400005],b[200005],c[200005],d[200005],e[200005],cnt=0,f[200005],g[200005],h[200005],aa[800005][3],ans;
bool bb[800005];
string s;
struct node
{
int id,next,to,dis;
} edge[400005];
void add(int from,int to,int dis)
{
++cnt0;
edge[cnt0]=(node){cnt0,head[from],to,dis};
head[from]=cnt0;
}
void dfs1(int x,int f)
{
int y,maxn=0;
b[x]=f;
c[x]=c[f]+1;
d[x]=1;
for (int i=head[x];i;i=edge[i].next)
{
y=edge[i].to;
if (y!=f)
{
a[y]=edge[i].dis;
p[edge[i].id]=y;
dfs1(y,x);
d[x]+=d[y];
if (d[y]>maxn)
{
maxn=d[y];
e[x]=y;
}
}
}
}
void dfs2(int x,int t)
{
int y;
f[x]=++cnt;
g[cnt]=a[x];
h[x]=t;
if (e[x])
{
dfs2(e[x],t);
for (int i=head[x];i;i=edge[i].next)
{
y=edge[i].to;
if (y!=b[x] && y!=e[x])
dfs2(y,y);
}
}
}
void build(int x,int l,int r)
{
if (l==r)
for (int i=0;i<3;++i)
aa[x][i]=g[l];
else
{
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
aa[x][0]=max(aa[x<<1][0],aa[x<<1|1][0]);
aa[x][1]=aa[x<<1][1]+aa[x<<1|1][1];
aa[x][2]=min(aa[x<<1][2],aa[x<<1|1][2]);
}
}
void modify1(int x,int bl,int br,int y,int z)
{
if (bl==br)
for (int i=0;i<3;++i)
aa[x][i]=z;
else
{
int mid=bl+br>>1;
if (bb[x])
{
for (int i=0;i<3;++i)
{
aa[x<<1][i]=-aa[x<<1][i];
aa[x<<1|1][i]=-aa[x<<1|1][i];
}
swap(aa[x<<1][0],aa[x<<1][2]);
swap(aa[x<<1|1][0],aa[x<<1|1][2]);
bb[x<<1]^=1;
bb[x<<1|1]^=1;
bb[x]=0;
}
if (y<=mid)
modify1(x<<1,bl,mid,y,z);
else
modify1(x<<1|1,mid+1,br,y,z);
aa[x][0]=max(aa[x<<1][0],aa[x<<1|1][0]);
aa[x][1]=aa[x<<1][1]+aa[x<<1|1][1];
aa[x][2]=min(aa[x<<1][2],aa[x<<1|1][2]);
}
}
void modify2(int x,int bl,int br,int l,int r)
{
if (l<=bl && bl<=r)
{
for (int i=0;i<3;++i)
aa[x][i]=-aa[x][i];
bb[x]^=1;
}
else
{
int mid=bl+br>>1;
if (bb[x])
{
for (int i=0;i<3;++i)
{
aa[x<<1][i]=-aa[x<<1][i];
aa[x<<1|1][i]=-aa[x<<1|1][i];
}
swap(aa[x<<1][0],aa[x<<1][2]);
swap(aa[x<<1|1][0],aa[x<<1|1][2]);
bb[x<<1]^=1;
bb[x<<1|1]^=1;
bb[x]=0;
}
if (l<=mid)
modify2(x<<1,bl,mid,l,r);
if (mid<r)
modify2(x<<1|1,mid+1,br,l,r);
aa[x][0]=max(aa[x<<1][0],aa[x<<1|1][0]);
aa[x][1]=aa[x<<1][1]+aa[x<<1|1][1];
aa[x][2]=min(aa[x<<1][2],aa[x<<1|1][2]);
}
}
int query(int x,int bl,int br,int l,int r,int k)
{
if (l<=bl && br<=r)
return aa[x][k];
int mid=bl+br>>1,result=(k-1)*0x7fffffffffffffff;
if (bb[x])
{
for (int i=0;i<3;++i)
{
aa[x<<1][i]=-aa[x<<1][i];
aa[x<<1|1][i]=-aa[x<<1|1][i];
}
swap(aa[x<<1][0],aa[x<<1][2]);
swap(aa[x<<1|1][0],aa[x<<1|1][2]);
bb[x<<1]^=1;
bb[x<<1|1]^=1;
bb[x]=0;
}
if (l<=mid)
{
if (k==0)
result=max(result,query(x<<1,bl,mid,l,r,k));
else if (k==1)
result+=query(x<<1,bl,mid,l,r,k);
else
result=min(result,query(x<<1,bl,mid,l,r,k));
}
if (mid<r)
{
if (k==0)
result=max(result,query(x<<1|1,mid+1,br,l,r,k));
else if (k==1)
result+=query(x<<1|1,mid+1,br,l,r,k);
else
result=min(result,query(x<<1|1,mid+1,br,l,r,k));
}
return result;
}
signed main()
{
cin>>n;
for (int i=1;i<n;++i)
{
scanf("%d%d%d",&x,&y,&z);
++x;
++y;
add(x,y,z);
add(y,x,z);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
cin>>m;
while (m--)
{
cin>>s;
scanf("%d%d",&x,&y);
++x;
++y;
if (s=="C")
modify1(1,1,n,f[p[x-1]],y-1);
else if (s=="N")
{
while (h[x]!=h[y])
{
if (c[h[x]]<c[h[y]])
swap(x,y);
modify2(1,1,n,f[h[x]],f[x]);
x=b[h[x]];
}
if (c[x]>c[y])
swap(x,y);
modify2(1,1,n,f[x]+1,f[y]);
}
else if (s=="SUM")
{
ans=0;
while (h[x]!=h[y])
{
if (c[h[x]]<c[h[y]])
swap(x,y);
ans+=query(1,1,n,f[h[x]],f[x],1);
x=b[h[x]];
}
if (c[x]>c[y])
swap(x,y);
if (x<y)
ans+=query(1,1,n,f[x]+1,f[y],1);
cout<<ans<<'\n';
}
else if (s=="MAX")
{
ans=0x8000000000000000;
while (h[x]!=h[y])
{
if (c[h[x]]<c[h[y]])
swap(x,y);
ans=max(ans,query(1,1,n,f[h[x]],f[x],0));
x=b[h[x]];
}
if (c[x]>c[y])
swap(x,y);
if (x<y)
ans=max(ans,query(1,1,n,f[x]+1,f[y],0));
cout<<ans<<'\n';
}
else
{
ans=0x7fffffffffffffff;
while (h[x]!=h[y])
{
if (c[h[x]]<c[h[y]])
swap(x,y);
ans=min(ans,query(1,1,n,f[h[x]],f[x],2));
x=b[h[x]];
}
if (c[x]>c[y])
swap(x,y);
if (x<y)
ans=min(ans,query(1,1,n,f[x]+1,f[y],2));
cout<<ans<<'\n';
}
}
}