#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct Edge{
int to,value;
};
#define ls(x) x<<1
#define rs(x) x<<1|1
#define inf 2147483647
int n,m;
int u,v,z;
vector<Edge>G[N];
int s[N],t[N];
string str;
int fa[N],dep[N],son[N],rnk[N],dfn[N],sz[N],a[N],top[N],cnt;
int siz[N<<2],w[N<<2],lzy[N<<2],maxx[N<<2],minn[N<<2];
void dfs1(int u,int father){
sz[u]=1;
fa[u]=father;
dep[u]=dep[father]+1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].to,w=G[u][i].value;
if(v==father){
continue;
}
a[v]=w;
dfs1(v,u);
if(sz[v]>sz[son[u]]){
son[u]=v;
}
}
}
void dfs2(int u,int tp){
dfn[u]=++cnt,top[u]=tp;
rnk[dfn[u]]=u;
if(!son[u]){
return;
}
dfs2(son[u],tp);
for(int i=0;i<G[u].size();i++){
int v=G[u][i].to;
if(v!=fa[u]&&v!=son[u]){
dfs2(v,v);
}
}
}
void pushup(int u){
w[u]=w[ls(u)]+w[rs(u)];
minn[u]=min(minn[ls(u)],minn[rs(u)]);
maxx[u]=max(maxx[ls(u)],maxx[rs(u)]);
}
void build(int u,int l,int r){
siz[u]=r-l+1;
if(l==r){
maxx[u]=minn[u]=w[u]=a[rnk[l]];
return;
}
int mid=l+r>>1;
build(ls(u),l,mid);
build(rs(u),mid+1,r);
pushup(u);
}
void pushdown(int u){
if(lzy[u]){
lzy[ls(u)]^=1,lzy[rs(u)]^=1;
w[ls(u)]=-w[ls(u)],w[rs(u)]=-w[rs(u)];
maxx[ls(u)]=-maxx[ls(u)],maxx[rs(u)]=-maxx[rs(u)];
minn[ls(u)]=-minn[ls(u)],minn[rs(u)]=-minn[rs(u)];
swap(maxx[ls(u)],minn[ls(u)]);
swap(maxx[rs(u)],minn[rs(u)]);
lzy[u]=0;
}
}
void update(int u,int l,int r,int pos,int p){
if(l==pos&&r==pos){
maxx[u]=minn[u]=w[u]=p;
}
else if(!(r<pos||pos<l)){
pushdown(u);
int mid=l+r>>1;
update(ls(u),l,mid,pos,p);
update(rs(u),mid+1,r,pos,p);
pushup(u);
}
}
void change(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
lzy[u]^=1;
w[u]=-w[u],maxx[u]=-maxx[u],minn[u]=-minn[u];
swap(maxx[u],minn[u]);
}
else if(!(r<L||R<l)){
pushdown(u);
int mid=l+r>>1;
change(ls(u),l,mid,L,R);
change(rs(u),mid+1,r,L,R);
pushup(u);
}
}
void fix(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
change(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dfn[x]>dfn[y]){
swap(x,y);
}
change(1,1,n,dfn[x]+1,dfn[y]);
}
int qry(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return w[u];
}
else if(!(r<L||R<l)){
pushdown(u);
int mid=l+r>>1;
return qry(ls(u),l,mid,L,R)+qry(rs(u),mid+1,r,L,R);
}
return 0;
}
int ask(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans+=qry(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dfn[x]>dfn[y]){
swap(x,y);
}
return ans+qry(1,1,n,dfn[x]+1,dfn[y]);
}
int qry_max(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return maxx[u];
}
else if(!(r<L||R<l)){
pushdown(u);
int mid=l+r>>1;
return max(qry_max(ls(u),l,mid,L,R),qry_max(rs(u),mid+1,r,L,R));
}
return -inf;
}
int ask_max(int x,int y){
int ans=-inf;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans=max(ans,qry_max(1,1,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
return max(ans,qry_max(1,1,n,dfn[x]+1,dfn[y]));
}
int qry_min(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return minn[u];
}
else if(!(r<L||R<l)){
pushdown(u);
int mid=l+r>>1;
return min(qry_min(ls(u),l,mid,L,R),qry_min(rs(u),mid+1,r,L,R));
}
return inf;
}
int ask_min(int x,int y){
int ans=inf;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans=min(ans,qry_min(1,1,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
return min(ans,qry_min(1,1,n,dfn[x]+1,dfn[y]));
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n;
for(int i=1;i<n;i++){
cin>>u>>v>>z;
u++,v++;
G[u].push_back({v,z});
G[v].push_back({u,z});
s[i]=u,t[i]=v;
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
for(int i=1;i<n;i++){
if(dep[s[i]]<dep[t[i]]){
swap(s[i],t[i]);
}
}
cin>>m;
while(m--){
cin>>str>>u>>v;
u++,v++;
if(str[0]=='C'){
v--;
update(1,1,n,dfn[s[u]],v);
}
else if(str[0]=='N'){
fix(u,v);
}
else if(str[0]=='S'){
cout<<ask(u,v)<<"\n";
}
else if(str[1]=='A'){
cout<<ask_max(u,v)<<"\n";
}
else{
cout<<ask_min(u,v)<<"\n";
}
}
return 0;
}