#include<stdio.h>
int max(int a,int b){return a>b?a:b;}
#define pl (p<<1)
#define pr (p<<1|1)
int T,n,cnt,tot,u[100001],v[100001],head[100001],siz[100001],dep[100001],fa[100001],son[100001],a[100001],top[100001],id[100001],w[100001];
struct Edge{int to,nxt,dis;}e[200001];
void add(int u,int v,int w){++tot,e[tot].to=v,e[tot].nxt=head[u],e[tot].dis=w,head[u]=tot;}
struct Tree{int cov,max;}tr[400001];
void cov(int p,int v){tr[p].cov=tr[p].max=v;}
void push_up(int p){tr[p].max=max(tr[pl].max,tr[pr].max);}
void push_down(int p){if(~tr[p].cov)cov(pl,tr[p].cov),cov(pr,tr[p].cov),tr[p].cov=-1;}
void build(int l,int r,int p){
tr[p].cov=-1;
if(l==r){tr[p].max=w[l];return;}
int mid=l+r>>1;build(l,mid,pl),build(mid+1,r,pr),push_up(p);
}void updatecov(int l,int r,int le,int ri,int v,int p){
if(l>=le&&r<=ri)return cov(p,v);
int mid=l+r>>1;push_down(p);
if(le<=mid)updatecov(l,mid,le,ri,v,pl);
if(ri>mid)updatecov(mid+1,r,le,ri,v,pr);
push_up(p);
}int query(int l,int r,int le,int ri,int p){
if(l>=le&&r<=ri)return tr[p].max;
int mid=l+r>>1,ret=0;push_down(p);
if(le<=mid)ret=max(ret,query(l,mid,le,ri,pl));
if(ri>mid)ret=max(ret,query(mid+1,r,le,ri,pr));
return ret;
}void updaterangecov(int x,int y,int v){
while(top[x]!=top[y])dep[top[x]]<dep[top[y]]&&(x^=y^=x^=y),updatecov(1,n,id[top[x]],id[x],v,1),x=fa[top[x]];
dep[x]>dep[y]&&(x^=y^=x^=y),updatecov(1,n,id[x]+1,id[y],v,1);
}int queryrange(int x,int y){
int ret=0;
while(top[x]!=top[y])dep[top[x]]<dep[top[y]]&&(x^=y^=x^=y),ret=max(ret,query(1,n,id[top[x]],id[x],1)),x=fa[top[x]];
return dep[x]>dep[y]&&(x^=y^=x^=y),max(ret,query(1,n,id[x]+1,id[y],1));
}void dfs1(int x,int y){
siz[x]=1,dep[x]=dep[y]+1,fa[x]=y;int mx=0;
for(int i=head[x];i;i=e[i].nxt)if(e[i].to!=y)a[e[i].to]=e[i].dis,dfs1(e[i].to,x),siz[x]+=siz[e[i].to],siz[e[i].to]>mx&&(mx=siz[e[i].to],son[x]=e[i].to);
}void dfs2(int x,int t){
top[x]=t,w[id[x]=++cnt]=a[x];
if(!son[x])return;
dfs2(son[x],t);
for(int i=head[x];i;i=e[i].nxt)if(e[i].to!=fa[x]&&e[i].to!=son[x])dfs2(e[i].to,e[i].to);
}int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n),cnt=0;
for(int i=1;i<=n;i++)head[i]=0;
for(int i=1,w;i<n;i++)scanf("%d%d%d",&u[i],&v[i],&w),add(u[i],v[i],w),add(v[i],u[i],w);
dfs1(1,0),dfs2(1,1),build(1,n,1);
for(char op[10];scanf("%s",op);){
if(op[0]=='D')break;int a,b;
scanf("%d%d",&a,&b);
if(op[0]=='C')updaterangecov(u[a],v[a],b);
if(op[0]=='Q')printf("%d\n",queryrange(a,b));
}
}return 0;
}