chain_ tree
//SPOJ
//Segment chain tree
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define L 50
#define M 100000+200
#define INF 0x7ffffff
#define rep(i,a,b) for(int i=a; i<=b; ++i)
using namespace std;
#define read(a) scanf("%d",&a)
struct node
{
int u,v,w;
};
int half(int a){return a>>1;}
int lson(int a){return a<<1;}
int rson(int a){return (a<<1)|1;}
struct node g[M*3];
struct tree
{
int l,r,w,min;
};
struct tree t[M*4];
int e;
int to[M] , bgn[M], nxt[M] , block;
int son[M] , fa[M], top[M] , dep[M], sz[M] , id[M];
void add(int x,int y){to[e]=y; nxt[e]=bgn[x]; bgn[x]=e; ++e;}
void init(){e=0; memset(bgn,-1,sizeof(bgn));}
void dfs_line(int u,int f,int dep_)
{
dep[u] = dep_;
son[u] = 0;
fa[u] = f;
sz[u] = 1;
for(int i=bgn[u]; i!=-1; i=nxt[i])
{
int v = to[i];
if(v == f) continue;
dfs_line(v , u , dep_ + 1);
sz[u] += sz[v];
if(sz[son[u]] < sz[v]) son[u] = v;
}
}
void dfs_chain(int u,int fa_)
{
id[u] = ++block;
top[u] = fa_;
if(son[u]!=0) dfs_chain(son[u],top[u]);
for(int i=bgn[u]; i!=-1; i=nxt[i])
{
int v = to[i];
if(v == fa[u] || v==son[u]) continue;
dfs_chain(v,v);
}
}
void chain()
{
sz[0] = 0; block = 0;
dfs_line(1,1,1);
dfs_chain(1,1);
}
void maintain(int h)
{
t[h].min = max(t[lson(h)].min , t[rson(h)].min);
}
void build(int h,int l,int r)
{
t[h].l=l;
t[h].r=r;
t[h].w=t[h].min=-INF;
if(l==r) return;
int mid = half(l+r);
build(lson(h),l,mid);
build(rson(h),mid+1,r);
maintain(h);
}
void set(int h,int Q,int key)
{
if(t[h].l==t[h].r) {t[h].w = t[h].min = key ; return ;}
int mid = half(t[h].l+t[h].r);
if(Q <= mid) set(lson(h),Q,key) ; else set(rson(h),Q,key);
maintain(h);
}
int find(int h, int ql , int qr)
{
if( ql<= t[h].l && t[h].r <= qr) return t[h].min;
int mid = half(t[h].l+t[h].r);
if(mid>=qr) return find(lson(h) , ql , qr);
else if(mid < ql) return find(rson(h) , ql, qr);
else return max(find(lson(h),ql,mid) , find(rson(h),mid+1,qr));
}
int LCA(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 , find(1 ,id[top[x]] , id[x]));
x = fa[top[x]];
}
if (dep[x]>dep[y]) swap(x,y);
if (x!=y) ans = max(ans , find(1, id[x]+1 , id[y]));
return ans;
}
int main()
{
int n,i,j,k,T; int x,y;
char str[L];
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
read(T); while(T--)
{
read(n); init();
rep(i,1,n-1) read(g[i].u),read(g[i].v),read(g[i].w),add(g[i].u,g[i].v),add(g[i].v, g[i].u);
chain(); build(1,2,n);
rep(i,1,n-1) {if(dep[g[i].u] > dep[g[i].v]) swap(g[i].u,g[i].v); set(1,id[g[i].v],g[i].w);}
while(1)
{
scanf("%s",str);
if(str[0]=='D') break;
read(x); read(y);
if(str[0]=='C') {set(1,id[g[x].v],y);}
if(str[0]=='Q') {printf("%d\n",LCA(x,y));}
}
puts("");
}
}