#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
const int maxn=2e5+5;
int n,m,cnt;
int head[maxn],to[maxn<<1],pre[maxn<<1],val[maxn<<1];
struct node
{
int x,y,z;
}e[maxn];
void link(int a,int b,int c)
{
to[++cnt]=b;
pre[cnt]=head[a];
head[a]=cnt;
val[cnt]=c;
}
int dep[maxn],siz[maxn],son[maxn],fa[maxn],a[maxn];
void dfs1(int x,int fath,int deep)
{
dep[x]=deep,fa[x]=fath,siz[x]=1;
for(int i=head[x];i;i=pre[i])
{
int y=to[i];
if(y!=fath)
{
dfs1(y,x,deep+1);
siz[x]+=siz[y];
if(siz[y]>siz[son[x]]) son[x]=y;
}
}
}
int tim;
int dfn[maxn],tp[maxn];
void dfs2(int x,int top)
{
dfn[x]=++tim,tp[x]=top;
if(!son[x]) return;
dfs2(son[x],top);
for(int i=head[x];i;i=pre[i])
{
int y=to[i];
if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
}
}
int t[maxn<<2],lz[maxn<<2],maxx[maxn<<2],minn[maxn<<2];
inline void up(int x)
{
t[x]=t[x<<1]+t[x<<1|1];
maxx[x]=max(maxx[x<<1],maxx[x<<1|1]);
minn[x]=min(minn[x<<1],minn[x<<1|1]);
}
inline void down(int x,int l,int r)
{
lz[x]=0;
lz[x<<1]^=1,lz[x<<1|1]^=1;
t[x<<1]=-t[x<<1],t[x<<1|1]=-t[x<<1|1];
minn[x<<1]=-minn[x<<1],minn[x<<1|1]=-minn[x<<1|1];
maxx[x<<1]=-maxx[x<<1],maxx[x<<1|1]=-maxx[x<<1|1];
swap(minn[x<<1],maxx[x<<1]);
swap(minn[x<<1|1],maxx[x<<1|1]);
}
void build(int x,int l,int r)
{
if(l==r)
{
t[x]=minn[x]=maxx[x]=a[l];
return;
}
build(lson),build(rson);
up(x);
}
void add(int x,int l,int r,int ql,int qr,int k)
{
if(ql>r||qr<l) return;
if(ql<=l&&r<=qr)
{
t[x]=minn[x]=maxx[x]=k;
return;
}
if(lz[x]) down(x,l,r);
add(lson,ql,qr,k),add(rson,ql,qr,k);
up(x);
}
void mul(int x,int l,int r,int ql,int qr)
{
if(ql>r||qr<l) return;
if(ql<=l&&r<=qr)
{
t[x]=-t[x];
minn[x]=-minn[x],maxx[x]=-maxx[x];
swap(minn[x],maxx[x]);
lz[x]^=1;
return;
}
if(lz[x]) down(x,l,r);
mul(lson,ql,qr),mul(rson,ql,qr);
up(x);
}
int qsum(int x,int l,int r,int ql,int qr)
{
if(ql>r||qr<l) return 0;
if(ql<=l&&r<=qr) return t[x];
if(lz[x]) down(x,l,r);
return qsum(lson,ql,qr)+qsum(rson,ql,qr);
}
int qmax(int x,int l,int r,int ql,int qr)
{
if(ql>r||qr<l) return 0;
if(ql<=l&&r<=qr) return maxx[x];
if(lz[x]) down(x,l,r);
return max(qmax(lson,ql,qr),qmax(rson,ql,qr));
}
int qmin(int x,int l,int r,int ql,int qr)
{
if(ql>r||qr<l) return 0;
if(ql<=l&&r<=qr) return minn[x];
if(lz[x]) down(x,l,r);
return min(qmin(lson,ql,qr),qmin(rson,ql,qr));
}
void tadd(int x,int y,int k)
{
while(tp[x]!=tp[y])
{
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
add(1,1,n,dfn[tp[x]],dfn[x],k);
x=fa[tp[x]];
}
if(dep[x]>dep[y]) swap(x,y);
add(1,1,n,dfn[x]+1,dfn[y],k);
}
void tmul(int x,int y)
{
while(tp[x]!=tp[y])
{
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
mul(1,1,n,dfn[tp[x]],dfn[x]);
x=fa[tp[x]];
}
if(dep[x]>dep[y]) swap(x,y);
mul(1,1,n,dfn[x]+1,dfn[y]);
}
int tsum(int x,int y)
{
int res=0;
while(tp[x]!=tp[y])
{
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
res+=qsum(1,1,n,dfn[tp[x]],dfn[x]);
x=fa[tp[x]];
}
if(dep[x]>dep[y]) swap(x,y);
res+=qsum(1,1,n,dfn[x]+1,dfn[y]);
}
int tmax(int x,int y)
{
int res=INT_MIN;
while(tp[x]!=tp[y])
{
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
res=max(res,qmax(1,1,n,dfn[tp[x]],dfn[x]));
x=fa[tp[x]];
}
if(dep[x]>dep[y]) swap(x,y);
res=max(res,qmax(1,1,n,dfn[x]+1,dfn[y]));
return res;
}
int tmin(int x,int y)
{
int res=INT_MAX;
while(tp[x]!=tp[y])
{
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
res=min(res,qmin(1,1,n,dfn[tp[x]],dfn[x]));
x=fa[tp[x]];
}
if(dep[x]>dep[y]) swap(x,y);
res=min(res,qmin(1,1,n,dfn[x]+1,dfn[y]));
return res;
}
int main()
{
n=read();
for(int i=1;i<n;i++)
{
int u=read()+1,v=read()+1,w=read();
link(u,v,w),link(v,u,w);
e[i].x=u,e[i].y=v,e[i].z=w;
}
dfs1(1,0,0);
dfs2(1,1);
for(int i=1;i<n;i++)
{
int x=e[i].x,y=e[i].y;
if(dep[x]>dep[y]) swap(x,y),swap(e[i].x,e[i].y);
a[dfn[y]]=e[i].z;
}
build(1,1,n);
m=read();
for(int i=1;i<=m;i++)
{
char s[10];
scanf("%s",s);
int x=read(),y=read();
if(s[0]=='C')
{
int v=e[x].y;
e[x].z=y;
add(1,1,n,dfn[v],dfn[v],y);
}
x++,y++;
if(s[0]=='N') tmul(x,y);
if(s[0]=='S') printf("%d\n",tsum(x,y));
if(s[1]=='A') printf("%d\n",tmax(x,y));
if(s[1]=='I') printf("%d\n",tmin(x,y));
}
return 0;
}