#include<bits/stdc++.h>
#define N 2000100
#define mid ((l+r)>>1)
#define int long long
using namespace std;
int n,m,cnt,hd[N],c;
struct node{
int to,nxt,val;
}e[N];
struct bian{
int x,y;
}bi[N];
int fa[N],maxson[N],dep[N],top[N],id[N],siz[N],tmp[N],sums[N],mins[N],maxs[N],laz[N],w[N];
void dfs1(int x,int f){
fa[x]=f;
dep[x]=dep[f]+1;
siz[x]=1;
for(int i=hd[x];i;i=e[i].nxt){
int v=e[i].to;
if(v==f){
continue;
}
tmp[v]=e[i].val;//the value of edge->value of point
dfs1(v,x);
siz[x]+=siz[v];
if(siz[maxson[x]]<siz[v]){
maxson[x]=v;
}
}
}
void dfs2(int x,int tops){
id[x]=++cnt;//new knot
w[cnt]=tmp[x];
top[x]=tops;
if(maxson[x]){
dfs2(maxson[x],tops);
}
for(int i=hd[x];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[x]||v==maxson[x]){
continue;
}
dfs2(v,v);
}
}
void pushup(int x){
mins[x]=min(mins[x<<1],mins[x<<1|1]);
maxs[x]=max(maxs[x<<1],maxs[x<<1|1]);
sums[x]=(sums[x<<1]+sums[x<<1|1]);
}
void build(int x,int l,int r){
if(l==r){
sums[x]=mins[x]=maxs[x]=w[l];
return;
}
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
void pushdown(int x){
laz[x<<1]^=1;laz[x<<1|1]^=1;
laz[x]=0;
mins[x<<1]=-mins[x<<1];
maxs[x<<1]=-maxs[x<<1];
swap(mins[x<<1],maxs[x<<1]);
sums[x<<1]=-sums[x<<1];
mins[x<<1|1]=-mins[x<<1|1];
maxs[x<<1|1]=-maxs[x<<1|1];
swap(mins[x<<1|1],maxs[x<<1|1]);
sums[x<<1|1]=-sums[x<<1|1];
}
void fan(int now,int x,int y,int l,int r){
if(x<=l&&r<=y){
laz[now]^=1;
mins[now]=-mins[now];
maxs[now]=-maxs[now];
swap(mins[now],maxs[now]);
sums[now]=-sums[now];
return;
}
if(laz[now]){
pushdown(now);
}
if(x<=mid){
fan(now<<1,x,y,l,mid);
}
if(y>mid){
fan(now<<1|1,x,y,mid+1,r);
}
pushup(now);
}
void ddxg(int now,int l,int r,int x,int y){
if(l==r){
mins[now]=maxs[now]=sums[now]=y;
return;
}
if(laz[now]){
pushdown(now);
}
if(x<=mid){
ddxg(now<<1,l,mid,x,y);
}else{
ddxg(now<<1|1,mid+1,r,x,y);
}
pushup(now);
}
int getsum(int now,int x,int y,int l,int r){
int ans=0;
if(x<=l&&y>=r){
return sums[now];
}
if(laz[now]){
pushdown(now);
}
if(x<=mid){
ans+=getsum(now<<1,x,y,l,mid);
}
if(y>mid){
ans+=getsum(now<<1|1,x,y,mid+1,r);
}
return ans;
}
int getmax(int now,int x,int y,int l,int r){
int ans=-2147483647;
if(x<=l&&y>=r){
return maxs[now];
}
if(laz[now]){
pushdown(now);
}
if(x<=mid){
ans=max(ans,getmax(now<<1,x,y,l,mid));
}
if(y>mid){
ans=max(ans,getmax(now<<1|1,x,y,mid+1,r));
}
return ans;
}
int getmin(int now,int x,int y,int l,int r){
int ans=2147483647;
if(x<=l&&y>=r){
return mins[now];
}
if(laz[now]){
pushdown(now);
}
if(x<=mid){
ans=min(ans,getmin(now<<1,x,y,l,mid));
}
if(y>mid){
ans=min(ans,getmin(now<<1|1,x,y,mid+1,r));
}
return ans;
}
void add(int x,int y,int z){
e[++c].to=y;
e[c].nxt=hd[x];
e[c].val=z;
hd[x]=cnt;
}
void update(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
fan(1,id[top[x]],id[x],1,n);
x=fa[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(x!=y){
fan(1,id[x]+1,id[y],1,n);
}
}
int qsum(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans+=getsum(1,id[top[x]],id[x],1,n);
x=fa[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(x!=y){
ans+=getsum(1,id[x]+1,id[y],1,n);
}
return ans;
}
int qmin(int x,int y){
int ans=2147483647;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans=min(ans,getmin(1,id[top[x]],id[x],1,n));
x=fa[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(x!=y){
ans=min(ans,getmin(1,id[x]+1,id[y],1,n));
}
return ans;
}
int qmax(int x,int y){
int ans=-2147483647;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans=max(ans,getmax(1,id[top[x]],id[x],1,n));
x=fa[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(x!=y){
ans=max(ans,getmax(1,id[x]+1,id[y],1,n));
}
return ans;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<n;i++){
int a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
a++,b++;
add(a,b,c);add(b,a,c);
bi[i].x=a,bi[i].y=b;
}
dfs1(1,0);dfs2(1,1);
build(1,1,n);
scanf("%lld",&m);
char s[5];
while(m--){
int a,b;
scanf("%s",s);
scanf("%lld%lld",&a,&b);
if(s[0]=='C'){
int aa=(dep[bi[a].x]>dep[bi[a].y]?bi[a].x:bi[a].y);
ddxg(1,1,n,id[aa],b);
}
if(s[0]=='N'){
a++,b++;
update(a,b);
}
if(s[0]=='S'){
a++,b++;
printf("%lld\n",qsum(a,b));
}
if(s[0]=='M'&&s[1]=='A'){
a++,b++;
printf("%lld\n",qmax(a,b));
}
if(s[0]=='M'&&s[1]=='I'){
a++,b++;
printf("%lld\n",qmin(a,b));
}
}
return 0;
}