#include<bits/stdc++.h>
using namespace std;
const int maxn = 100003;
int n,cnt;
int w[maxn],dson[maxn],siz[maxn],f[maxn],dep[maxn];
int top[maxn],b[maxn],id[maxn];
namespace Seg
{
int a[maxn << 2],mx[maxn << 2];
#define ls p << 1
#define rs p << 1 | 1
void pushup(int p)
{
a[p] = a[ls] + a[rs];
mx[p] = max(mx[ls],mx[rs]);
}
void build(int p,int l,int r)
{
if(l == r)
{
a[p] = mx[p] = w[l];
return ;
}
int mid = l + r >> 1;
build(ls,l,mid);
build(rs,mid + 1,r);
pushup(p);
}
void update(int p,int l,int r,int k,int v)
{
if(l == r)
{
a[p] = mx[p] = v;
return ;
}
int mid = l + r >> 1;
if(k <= mid)
{
update(ls,l,mid,k,v);
}
else
{
update(rs,mid + 1,r,k,v);
}
pushup(p);
}
int query(int p,int l,int r,int nl,int nr)
{
if(nl <= l && r <= nr)
{
return mx[p];
}
int res = -0x3f3f3f3f;
int mid = l + r >> 1;
if(nl <= mid)
{
res = max(res,query(ls,l,mid,nl,nr));
}
if(nr > mid)
{
res = max(res,query(rs,mid + 1,r,nl,nr));
}
return res;
}
}using namespace Seg;
struct edge
{
int nxt,to,w;
}e[maxn << 1];
int head[maxn],tot;
void add_edge(int u,int v,int w)
{
e[++tot].nxt = head[u];
head[u] = tot;
e[tot].to = v;
e[tot].w = w;
}
struct node
{
int u,v,w;
}E[maxn];
void dfs1(int u,int fa,int d)
{
f[u] = fa;
dep[u] = d;
siz[u] = 1;
for(int i = head[u];i;i = e[i].nxt)
{
int v = e[i].to;
if(v == fa)
{
b[u] = e[i].w;
continue;
}
dfs1(v,u,d + 1);
siz[u] += siz[v];
if (siz[v] > siz[dson[u]])
{
dson[u] = v;
}
}
return;
}
inline void dfs2(int u,int fa)
{
top[u] = fa;
id[u] = ++cnt;
w[cnt] = b[u];
if (!dson[u])
{
return;
}
dfs2(dson[u],fa);
for(int i = head[u];i;i = e[i].nxt)
{
int v = e[i].to;
if(v != f[u] && v != dson[u])
{
dfs2(v,v);
}
}
return;
}
int pathMax(int u,int v)
{
int res = -0x3f3f3f3f;
while(top[u] != top[v])
{
if(dep[top[u]] < dep[top[v]])
{
swap(u,v);
}
res = max(res,query(1,1,n,id[top[u]],id[u]));
u = f[top[u]];
}
if(dep[u] > dep[v])
{
swap(u,v);
}
res = max(res,query(1,1,n,id[u] + 1,id[v]));
return res;
}
void init()
{
memset(head,0,sizeof(head));
tot = 0;
memset(a,0,sizeof(a));
memset(mx,0,sizeof(mx));
memset(siz,0,sizeof(siz));
memset(dson,0,sizeof(dson));
}
void solve()
{
cin >> n;
for(int i = 1;i < n;i++)
{
int u,v,w;
cin >> u >> v >> w;
add_edge(u,v,w);
add_edge(v,u,w);
E[i] = {u,v,w};
}
dfs1(1,0,1);
dfs2(1,1);
build(1,1,n);
string str;
cin >> str;
while(1)
{
if(str == "DONE")
{
break;
}
int u,v;
cin >> u >> v;
if(str == "QUERY")
{
if(u != v)
{
cout << pathMax(u,v) << '\n';
}
else
{
cout << 0 << '\n';
}
}
else
{
if(dep[E[u].u] > dep[E[u].v])
{
u = E[u].u;
}
else
{
u = E[u].v;
}
update(1,1,n,id[u],v);
}
cin >> str;
}
}
int main()
{
int t;
cin >> t;
while(t--)
{
solve();
}
return 0;
}