RT
#include<stdio.h>
#define int long long
#define N 100010
int h[N],e[N<<1],nx[N<<1],c[N<<1],ww[N],n;
int dfn[N],sz[N],top[N],son[N],idx,cnt,nw[N],d[N],fa[N];
int max(int x,int y){
if (x>y) return x;
return y;
}
void add(int u,int v,int w){
e[idx]=v,c[idx]=w,nx[idx]=h[u],h[u]=idx++;
e[idx]=u,c[idx]=w,nx[idx]=h[v],h[v]=idx++;
}
void dfs1(int u,int f){
sz[u]=1,fa[u]=f;
for (int i=h[u];~i;i=nx[i]){
int v=e[i],w=c[i];
if (v==f) continue;
ww[v]=w;
d[v]=d[u]+1;
dfs1(v,u);
sz[u]+=sz[v];
if (sz[son[u]]<sz[v]) son[u]=v;
}
}
void dfs2(int u,int t){
top[u]=t,dfn[u]=++cnt,nw[cnt]=ww[u];
if (!son[u]) return ;
dfs2(son[u],t);
for (int i=h[u];~i;i=nx[i]){
int v=e[i];
if (v==son[u]||v==fa[u]) continue;
dfs2(v,v);
}
}
struct nord{
int l,r,mx;
}t[N<<2];
#define lc k<<1
#define rc k<<1|1
void pushup(int k){
t[k].mx=max(t[lc].mx,t[rc].mx);
}
void build(int k,int l,int r){
t[k].l=l,t[k].r=r;
if (l==r){
t[k].mx=nw[l];
return ;
}
int mid=(l+r)/2;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(k);
}
void change(int k,int x,int p){
if (t[k].l==t[k].r){
t[k].mx=p;
return ;
}
int mid=(t[k].l+t[k].r)/2;
if (x<=mid) change(lc,x,p);
else change(rc,x,p);
pushup(k);
}
int ask(int k,int l,int r){
if (l<=t[k].l&&r>=t[k].r) return t[k].mx;
int ans=-1e9;
int mid=(t[k].l+t[k].r)/2;
if (l<=mid) ans=max(ans,ask(lc,l,r));
if (r>mid) ans=max(ans,ask(rc,l,r));
return ans;
}
void swap1(int *u,int *v){
int t=*v;
*v=*u;
*u=t;
}
int op1(int u,int v){
if (u==v) return 0;
int ans=-1e9;
while(top[u]!=top[v]){
if (d[top[u]]<d[top[v]]) swap1(&u,&v);
ans=max(ans,ask(1,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if (d[u]<d[v]) swap1(&u,&v);
if (u!=v) ans=max(ans,ask(1,dfn[v]+1,dfn[u]));
return ans;
}
struct id{
int x,y;
}a[N];
main(){
int t;
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
cnt=idx=0;
for (int i=1;i<=n;i++) h[i]=-1;
for (int i=1;i<n;i++){
int u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
a[i].x=u,a[i].y=v;
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
while(1){
int u,v;
char op[20];
scanf("%s",op);
if (*op=='D') break;
scanf("%lld%lld",&u,&v);
if (*op=='C'){
int x=a[u].x,y=a[u].y;
if (d[x]<d[y]) swap1(&x,&y);
change(1,dfn[x],v);
}
else printf("%lld\n",op1(u,v));
}
}
return 0;
}