#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<iostream>
#define SF scanf
#define PF printf
#define ls (i<<1)
#define rs (i<<1|1)
using namespace std;
typedef long long LL;
const int MAXN = 10000;
const int INF = 0x3f3f3f3f;
int n;
char s[10];
// Build Edge
struct node {
int v;
node *next;
} Edge[MAXN*3+10], *ecnt = &Edge[0], *adj[MAXN+10];
inline void addedge(int u, int v) {
node *p = ++ecnt;
p->v = v;
p->next = adj[u];
adj[u] = p;
}
inline void add(int u, int v) {
addedge(u, v); addedge(v, u);
}
// DFS
int F[MAXN+10], son[MAXN+10], idx[MAXN+10], L[MAXN+10];
int sz[MAXN+10], top[MAXN+10]; // top 重链头 idx(x到x父亲边的编号)
int dfn;
void dfs(int u, int fa, int lev) {
son[u] = 0; F[u] = fa; L[u] = lev; sz[u] = 1;
for(node *p = adj[u]; p; p = p->next) {
int v = p->v;
if(v == fa) continue;
dfs(v, u, lev+1);
sz[u] += sz[v];
if(sz[v] > sz[son[u]]) son[u] = v;
}
}
void Getid(int u, int tp) {
idx[u] = ++dfn; top[u] = tp;
if(son[u]) Getid(son[u], top[u]);
for(node *p = adj[u]; p; p = p->next) {
int v = p->v;
if(v == F[u] || v == son[u]) continue;
Getid(v, v);
}
}
// Seg Tree
struct Seg_Tree {
int MAX[(MAXN<<2)+10], VAL[(MAXN<<2)+10];
int L[(MAXN<<2)+10], R[(MAXN<<2)+10], Mid[(MAXN<<2)+10];
void build(int i, int l, int r) {
VAL[i] = MAX[i] = -INF;
L[i] = l; R[i] = r;
if(l == r) return ;
int mid = Mid[i] = l + (r-l) / 2;
build(ls, l, mid);
build(rs, mid+1, r);
}
void ins(int i, int x, int val) {
if(L[i] == R[i]) {
VAL[i] = MAX[i] = val;
return ;
}
int mid = Mid[i];
if(x <= mid) ins(ls, x, val);
else ins(rs, x, val);
MAX[i] = max(MAX[ls], MAX[rs]);
}
int query(int i, int l, int r) {
if(l <= L[i] && R[i] <= r) return MAX[i];
int mid = Mid[i], ret = -INF;
if(l <= mid) ret = max(ret, query(ls, l, r));
if(r > mid) ret = max(ret, query(rs, l, r));
return ret;
}
} seg;
// LCA
inline int find(int x, int y) {
int ans = -INF;
while(top[x] != top[y]) {
if(L[top[x]] < L[top[y]]) swap(x, y);
ans = max(ans, seg.query(1, idx[top[x]], idx[x]));
x = F[top[x]];
}
if(L[x] > L[y]) swap(x, y);
if(x != y) ans = max(ans, seg.query(1, idx[x]+1, idx[y]));
return ans;
}
// Main
int E[MAXN+10][3];
int main()
{
int _T; SF("%d", &_T); while(_T--) {
dfn = 0; ecnt = &Edge[0]; memset(adj, 0, sizeof(adj));
SF("%d", &n);
for(int i = 1; i < n; i++) {
SF("%d%d%d", &E[i][0], &E[i][1], &E[i][2]);
add(E[i][0], E[i][1]);
}
dfs(1, 1, 1);
Getid(1, 1);
seg.build(1, 2, n);
for(int i = 1; i < n; i++) {
if(L[E[i][0]] > L[E[i][1]]) swap(E[i][0], E[i][1]);
seg.ins(1, idx[E[i][1]], E[i][2]);
}
while(SF("%s", s)) {
if(s[0] == 'D') break;
else if(s[0] == 'C') {
int x, val; SF("%d%d", &x, &val);
seg.ins(1, idx[E[x][1]], val);
}
else {
int x, y; SF("%d%d", &x, &y);
PF("%d\n", find(x, y));
}
}
puts("");
}
return 0;
}