#include <stdio.h>
int dep[100010], cnt, a[100010], dfn[100010], top[100010], fa[100010], siz[100010], val[100010], son[100010], now[100010], u[100010], v[100010], w[100010];
int len, nxt[200010], edge[200010], head[100010], W[200010];
int max(int x, int y) {return x > y ? x : y;}
void insert(int x, int y, int z) {
edge[++len] = y;
W[len] = z;
nxt[len] = head[x];
head[x] = len;
}
struct node {
int l, r, max;
} t[100010 << 2];
int ls(int k) {return k<<1;}
int rs(int k) {
return k<<1|1;
}
void build(int k, int l, int r) {
t[k].l = l; t[k].r = r;
if (l == r) {
t[k].max = a[l];
return ;
}
int mid=(l+r)>>1;
build(ls(k), l, mid); build(rs(k), mid+1, r);
t[k].max = max(t[ls(k)].max, t[rs(k)].max);
}
void change(int k, int s, int val) {
int l = t[k].l, r = t[k].r;
if (l == r) {
t[k].max = val;
return ;
}
int mid=(l+r)>>1;
if (s <= mid) change(ls(k), s, val);
else change(rs(k), s, val);
t[k].max = max(t[ls(k)].max, t[rs(k)].max);
}
int query(int k, int L, int R) {
int l = t[k].l, r = t[k].r;
if (l >= L && r <= R) return t[k].max;
int ans = 0;
int mid=(l+r)>>1;
if (L <= mid) ans = max(ans, query(ls(k), L, R));
if (R > mid) ans = max(ans, query(rs(k), L, R));
return ans;
}
int ask(int l, int r) {
if (l > r) return 0;
return query(1, l, r);
}
void dfs1(int u, int f) {
fa[u] = f;
siz[u] = 1;
for (int i = head[u]; i; i = nxt[i]) {
if (edge[i] != f) {
val[edge[i]] = W[i];
dfs1(edge[i], u);
if (siz[edge[i]] > siz[son[u]]) son[u] = edge[i];
siz[u] += siz[edge[i]];
}
}
}
void dfs2(int u, int f) {
dfn[u] = ++cnt;
now[cnt] = u;
dep[u] = dep[fa[u]] + 1;
top[u] = f;
if (son[u]) dfs2(son[u], f);
for (int i = head[u]; i; i = nxt[i]) {
if (edge[i] != fa[u] && edge[i] != son[u]) {
dfs2(edge[i], edge[i]);
}
}
}
void lca(int u, int v) {
int ans = 0;
while (top[u] != top[v]) {
if (dep[top[u]] > dep[top[v]]) u ^= v ^= u ^= v;
ans = max(ans, ask(dfn[top[v]], dfn[v]));
v = fa[top[v]];
}
if (dep[u] > dep[v]) u ^= v ^= u ^= v;
ans = max(ans, ask(dfn[u]+1, dfn[v]));
printf("%d\n", ans);
}
int main() {
int t; scanf("%d", &t); while (t--) {
int n; scanf("%d", &n); len = cnt = 0;
for (int i = 1; i <= n; ++i) head[i] = siz[i] = dep[i] = 0;
for (int i = 1; i < n; ++i) {
scanf("%d %d %d", &u[i], &v[i], &w[i]);
insert(u[i], v[i], w[i]);
insert(v[i], u[i], w[i]);
}
dfs1(1, 0);
dfs2(1, 1);
for (int i = 1; i <= n; ++i) a[i] = val[now[i]];
char s[111];
build(1, 1, n);
while (~scanf("%s",s+1)) {
if (s[1] == 'D') break;
int x, y; scanf("%d %d", &x, &y);
if (s[1] == 'C') {
if (fa[v[x]] == u[x]) change(1, dfn[v[x]], y);
else change(1, dfn[u[x]], y);
} else {
lca(x, y);
}
} }
return 0;
}