#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=300009;
typedef struct node
{
int to,num;
}N;
struct nd
{
int l,r,sum,maxn,minn,lz;
}tr[maxn*4];
struct nnd
{
int s1,s2,num;
}in[maxn];
int n,m,tim=0;
vector<N> edge[maxn];
int fa[maxn],w[maxn],v[maxn],hson[maxn],top[maxn];
int size[maxn],dfn[maxn],rnk[maxn],dep[maxn];
void dfs1(int i,int t);
void dfs2(int i,int t);
void build(int i,int l,int r);
void chg1(int i,int l,int r);
void chg2(int i,int t,int x);
void push_down(int i);
int findsum(int i,int l,int r);
int findmax(int i,int l,int r);
int findmin(int i,int l,int r);
void c1();
void c2();
void c3();
void c4();
void c5();
inline int read();
int main()
{
cin>>n;
for(int t=1;t<n;t++)
{
N pro;
in[t].s1=read();in[t].s2=read();in[t].num=read();
pro.num=in[t].num;
pro.to=in[t].s2;
edge[in[t].s1].push_back(pro);
pro.to=in[t].s1;
edge[in[t].s2].push_back(pro);
}
dfs1(0,-1);
dfs2(0,0);
m=read();
build(1,1,n);
while(m--)
{
char str[5];
scanf("%s",str);
if(str[0]=='C')
c1();
else if(str[0]=='N')
c2();
else if(str[0]=='S')
c3();
else if(str[1]=='A')
c4();
else
c5();
}
}
void dfs1(int i,int t)
{
if(t==-1)dep[i]=1;
else dep[i]=dep[t]+1;
hson[i]=-1;
fa[i]=t;
size[i]=1;
int maxsize=-1;
for(vector<N>::iterator it=edge[i].begin();it!=edge[i].end();it++)
{
N pro=*it;
if(pro.to!=t)
{
w[pro.to]=pro.num;
dfs1(pro.to,i);
size[i]+=size[pro.to];
if(maxsize<size[pro.to])
{
maxsize=size[pro.to];
hson[i]=pro.to;
}
}
}
return;
}
void dfs2(int i,int t)
{
tim++;
dfn[i]=tim;
rnk[tim]=i;
v[tim]=w[i];
top[i]=t;
if(hson[i]==-1)return;
dfs2(hson[i],t);
for(vector<N>::iterator it=edge[i].begin();it!=edge[i].end();it++)
{
N pro=*it;
if(pro.to!=fa[i]&&pro.to!=hson[i])
dfs2(pro.to,pro.to);
}
return;
}
void build(int i,int l,int r)
{
tr[i].l=l;tr[i].r=r;tr[i].lz=0;
if(l==r)
{
tr[i].maxn=v[l];
tr[i].minn=v[l];
tr[i].sum=v[l];
return;
}
int lson=i<<1;
int rson=i<<1|1;
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
tr[i].maxn=max(tr[lson].maxn,tr[rson].maxn);
tr[i].minn=min(tr[lson].minn,tr[rson].minn);
tr[i].sum=tr[lson].sum+tr[rson].sum;
return;
}
void chg1(int i,int l,int r)
{
if(tr[i].l>r||tr[i].r<l)return;
if(l<=tr[i].l&&tr[i].r<=r)
{
tr[i].lz^=1;
tr[i].sum=-tr[i].sum;
swap(tr[i].maxn,tr[i].minn);
tr[i].maxn=-tr[i].maxn;
tr[i].minn=-tr[i].minn;
return;
}
push_down(i);
int lson=i<<1;
int rson=i<<1|1;
chg1(lson,l,r);
chg1(rson,l,r);
tr[i].maxn=max(tr[lson].maxn,tr[rson].maxn);
tr[i].minn=min(tr[lson].minn,tr[rson].minn);
tr[i].sum=tr[lson].sum+tr[rson].sum;
return;
}
void chg2(int i,int t,int x)
{
if(tr[i].l>t||tr[i].r<t)return;
if(tr[i].l==tr[i].r&&tr[i].l==t)
{
tr[i].sum=x;
tr[i].maxn=x;
tr[i].minn=x;
return;
}
push_down(i);
int lson=i<<1;
int rson=i<<1|1;
chg2(lson,t,x);
chg2(rson,t,x);
tr[i].maxn=max(tr[lson].maxn,tr[rson].maxn);
tr[i].minn=min(tr[lson].minn,tr[rson].minn);
tr[i].sum=tr[lson].sum+tr[rson].sum;
return;
}
void push_down(int i)
{
if(tr[i].lz)
{
int lson=i<<1;
int rson=i<<1|1;
tr[lson].lz^=tr[i].lz;
tr[rson].lz^=tr[i].lz;
tr[lson].sum=-tr[lson].sum;
tr[rson].sum=-tr[rson].sum;
swap(tr[lson].maxn,tr[lson].minn);
swap(tr[rson].maxn,tr[rson].minn);
tr[lson].maxn=-tr[lson].maxn;
tr[rson].maxn=-tr[rson].maxn;
tr[lson].minn=-tr[lson].minn;
tr[rson].minn=-tr[rson].minn;
tr[i].lz=0;
}
return;
}
int findsum(int i,int l,int r)
{
if(l>tr[i].r||tr[i].r<l)return 0;
int res=0;
if(l<=tr[i].l&&tr[i].r<=r)
return tr[i].sum;
push_down(i);
return findsum(i<<1,l,r)+findsum(i<<1|1,l,r);
}
int findmax(int i,int l,int r)
{
if(l>tr[i].r||tr[i].r<l)return -100000;
if(l<=tr[i].l&&tr[i].r<=r)
return tr[i].maxn;
push_down(i);
return max(findmax(i<<1,l,r),findmax(i<<1|1,l,r));
}
int findmin(int i,int l,int r)
{
if(l>tr[i].r||tr[i].r<l)return 100000;
if(l<=tr[i].l&&tr[i].r<=r)
return tr[i].minn;
push_down(i);
return min(findmin(i<<1,l,r),findmin(i<<1|1,l,r));
}
void c1()
{
int xi,b1,b2,x;
xi=read();x=read();
b1=in[xi].s1;
b2=in[xi].s2;
if(dep[b1]<dep[b2])
swap(b1,b2);
chg2(1,dfn[b1],x);
return;
}
void c2()
{
int u,v;
u=read();v=read();
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])
swap(u,v);
chg1(1,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(u!=v)
{
if(dep[u]<dep[v])
swap(u,v);
chg1(1,dfn[v]+1,dfn[u]);
}
return;
}
void c3()
{
int res=0;
int u,v;
u=read();v=read();
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])
swap(u,v);
res+=findsum(1,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(u!=v)
{
if(dep[u]<dep[v])
swap(u,v);
res+=findsum(1,dfn[v]+1,dfn[u]);
}
printf("%d\n",res);
return;
}
void c4()
{
int res=-100000;
int u,v;
u=read();v=read();
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])
swap(u,v);
res=max(res,findmax(1,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(u!=v)
{
if(dep[u]<dep[v])
swap(u,v);
res=max(res,findmax(1,dfn[v]+1,dfn[u]));
}
printf("%d\n",res);
return;
}
void c5()
{
int res=100000;
int u,v;
u=read();v=read();
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])
swap(u,v);
res=min(res,findmin(1,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(u!=v)
{
if(dep[u]<dep[v])
swap(u,v);
res=min(res,findmin(1,dfn[v]+1,dfn[u]));
}
printf("%d\n",res);
return;
}
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*10+ch-48;ch=getchar();}
return x*f;
}