#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b) ((a)>(b)?a:b)
#define min(a,b) ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define mid ((l+r)>>1)
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=2e5+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){ re int x=0,f=0;re char c=getchar(); while(!isdigit(c)) f|=(c=='-'),c=getchar(); while(isdigit(c)) x=(x<<3)+(x<<1)+c-'0',c=getchar(); return f?-x:x;}
in void write(re int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}
int n,m;
struct edge{
int u,v,w;
int nx;
}e[M<<2];
int head[N<<2],tot;
in void add(re int u,re int v,re int w){
e[++tot].u=u;
e[tot].v=v;
e[tot].w=w;
e[tot].nx=head[u];
head[u]=tot;
}
int idx,fa[N],son[N],top[N],siz[N],id[N],w[N],wt[N],dep[N];
void dfs1(re int u,re int f,re int depth){
dep[u]=depth;
fa[u]=f;
siz[u]=1;
re int maxson=-1;
for(re int i=head[u];i;i=e[i].nx){
re int v=e[i].v;
if(v==f) continue;
dfs1(v,u,depth+1);
w[v]=e[i].w;
siz[u]+=siz[v];
if(siz[v]>maxson){
son[u]=v;
maxson=siz[v];
}
}
}
void dfs2(re int u,re int topf){
id[u]=++idx;
wt[id[u]]=w[u];
top[u]=topf;
if(!son[u]) return ;
dfs2(son[u],topf);
for(re int i=head[u];i;i=e[i].nx){
re int v=e[i].v;
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
return ;
}
int sumn[N<<2],maxn[N<<2],minn[N<<2],lazy[N<<2];
in void pushup(re int x){
sumn[x]=sumn[ls]+sumn[rs];
maxn[x]=max(maxn[ls],maxn[rs]);
minn[x]=min(minn[ls],minn[rs]);
}
void build(re int x,re int l,re int r){
if(l==r){
sumn[x]=maxn[x]=minn[x]=wt[l];
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(x);
}
in void pushdown(re int x){
if(lazy[x]){
lazy[ls]^=1;lazy[rs]^=1;
sumn[ls]=-sumn[ls];sumn[rs]=-sumn[rs];
maxn[ls]=-maxn[ls];maxn[rs]=-maxn[rs];
minn[ls]=-minn[ls];minn[rs]=-minn[rs];
swap(maxn[ls],minn[ls]);
swap(maxn[rs],minn[rs]);
lazy[x]=0;
}
}
in void update(re int x,re int l,re int r,re int L,re int k){
if(l==r){
sumn[x]=maxn[x]=minn[x]=k;
return;
}
pushdown(x);
if(L<=mid) update(ls,l,mid,L,k);
if(L>mid) update(rs,mid+1,r,L,k);
pushup(x);
}
void change(re int x,re int l,re int r,re int L,re int R){
if(L<=l&&R>=r){
lazy[x]^=1;
sumn[x]=-sumn[x];
maxn[x]=-maxn[x];
minn[x]=-minn[x];
swap(maxn[x],minn[x]);
return ;
}
pushdown(x);
if(L<=mid) change(ls,l,mid,L,R);
if(R>mid) change(rs,mid+1,r,L,R);
pushup(x);
}
in int qsum(re int x,re int l,re int r,re int L,re int R){
int res=0;
if(L<=l&&R>=r){
return sumn[x];
}
pushdown(x);
if(L<=mid) res+=qsum(ls,l,mid,L,R);
if(R>mid) res+=qsum(rs,mid+1,r,L,R);
pushup(x);
return res;
}
in int qmax(re int x,re int l,re int r,re int L,re int R){
int res=-INF;
if(L<=l&&R>=r) {
return maxn[x];
}
pushdown(x);
if(L<=mid)res=max(res,qmax(ls,l,mid,L,R));
if(R>mid) res=max(res,qmax(rs,mid+1,r,L,R));
pushup(x);
return res;
}
int qmin(re int x,re int l,re int r,re int L,re int R){
int res=INF;
if(L<=l&&R>=r){
return minn[x];
}
pushdown(x);
if(L<=mid) res=min(res,qmin(ls,l,mid,L,R));
if(R>mid) res=min(res,qmin(rs,mid+1,r,L,R));
pushup(x);
return res;
}
//
in void update(re int x,re int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
change(1,1,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) change(1,1,n,id[x]+1,id[y]);
}
in int qsum(re int x,re int y){
int res=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
res+=qsum(1,1,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) res+=qsum(1,1,n,id[x]+1,id[y]);
/*要判断是否重合,重合的话就不用算了,+1就下面去了abb*/
return res;
}
in int qmax(re int x,re int y){
int res=-INF;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
res=max(res,qmax(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) res=max(res,qmax(1,1,n,id[x]+1,id[y]));
return res;
}
in int qmin(re int x,re int y){
int res=INF;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
res=min(res,qmin(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) res=min(res,qmin(1,1,n,id[x]+1,id[y]));
return res;
}
struct node{
int x,y;
}idd[N];
signed main(){
n=read();
for(re int i=1;i<n;i++){
re int x,y,z;
x=read()+1;y=read()+1;z=read();
add(x,y,z);add(y,x,z);
idd[i].x=x;idd[i].y=y;
}
dfs1(1,0,1);dfs2(1,1);
build(1,1,n);
m=read();
while(m--){
re char s[10];
scanf("%s",&s);
re int x,y;
x=read();y=read();
if(s[0]=='C'){
re int z;
if(dep[idd[x].x]>dep[idd[x].y]) z=idd[x].x;
else z=idd[x].y;
update(1,1,n,id[z],y);
}
else if(s[0]=='N'){
x++;y++;
update(x,y);
}
else if(s[0]=='S'){
x++;y++;
write(qsum(x,y));
putchar(10);
}
else if(s[0]=='M'){
if(s[1]=='A'){
x++;y++;
write(qmax(x,y));
putchar(10);
}
else if(s[1]=='I'){
x++;y++;
write(qmin(x,y));
putchar(10);
}
}
}
return 0;
}
救救我吧