#include <bits/stdc++.h>
// M1nK's Ducky Mask: "Strongest Man In The World"
//#pragma GCC target ("avx2")
//#pragma GCC optimization ("O3")
//#pragma GCC optimization ("unroll-loops")
#define task "TASK"
#define fi first
#define se second
#define pi acos (-1)
#define pb push_back
#define ll long long
#define ld long double
#define pll pair <ll, ll>
#define pll2 pair <ll, pll>
#define all(a) a.begin (), a.end ()
#define heap_max(a) priority_queue <a>
#define FOR(i, a, b) for (ll i = (a); i <= (b); ++i)
#define FOD(i, a, b) for (ll i = (a); i >= (b); --i)
#define FOr(i, a, b, c) for (ll i = (a); i <= (b); i += (c))
#define FOd(i, a, b, c) for (ll i = (a); i >= (b); i -= (c))
#define heap_min(a) priority_queue <a, vector <a>, greater <a>>
#define Mirai ios_base:: sync_with_stdio (0);
#define Kuriyama cin.tie (nullptr); cout.tie (nullptr);
using namespace std;
const ll INF = 1e18;
const ll MOD = 1e9 + 7;
const ll minN = 1e3 + 7;
const ll maxN = 1e4 + 7;
const ll LOG = __lg (maxN) + 1;
template <class X> ll getbit (X s, ll i) { return (s >> i) & 1; }
template <class X> ll cntbit (X s) { return __builtin_popcountll (s); }
template <class X, class Y> bool maximize (X &a, Y b) { if (a < b) return a = b, 1; return 0; }
template <class X, class Y> bool minimize (X &a, Y b) { if (a > b) return a = b, 1; return 0; }
// --------------- M1nK_08 --------------- //
string type;
ll t, n, u, v, w;
vector <ll> adj[maxN];
ll a[maxN], val[maxN], edge[maxN];
struct Data { ll x, y, z; } p[maxN];
ll sz[maxN], par[maxN], h[maxN], hv[maxN];
void DFS (ll u, ll p) {
sz[u] = 1;
for (auto v: adj[u]) {
if (v == p) continue;
par[v] = u;
h[v] = h[u] + 1;
DFS (v, u);
sz[u] += sz[v];
if (sz[v] > sz[hv[u]]) hv[u] = v;
}
}
ll st[4 * maxN][2], lz[4 * maxN];
void Lazy (ll id) {
lz[id] ^= 1;
ll tmp = st[id][1];
st[id][1] = -st[id][0];
st[id][0] = -tmp;
}
void Down (ll id) {
if (lz[id]) {
Lazy (id << 1);
Lazy (id << 1 | 1);
lz[id] = 0;
}
}
void Build (ll id, ll l, ll r) {
if (l == r) {
st[id][0] = st[id][1] = a[l];
return;
}
ll mid = (l + r) >> 1;
Build (id << 1, l, mid);
Build (id << 1 | 1, mid + 1, r);
st[id][0] = min (st[id << 1][0], st[id << 1 | 1][0]);
st[id][1] = max (st[id << 1][1], st[id << 1 | 1][1]);
}
void Upd (ll id, ll l, ll r, ll pos, ll val) {
if (l == r) {
st[id][0] = st[id][1] = val;
return;
}
Down (id);
ll mid = (l + r) >> 1;
if (pos <= mid) Upd (id << 1, l, mid, pos, val);
else Upd (id << 1 | 1, mid + 1, r, pos, val);
st[id][0] = min (st[id << 1][0], st[id << 1 | 1][0]);
st[id][1] = max (st[id << 1][1], st[id << 1 | 1][1]);
}
ll Get (ll id, ll l, ll r, ll u, ll v) {
if (r < u || v < l) return -INF;
if (u <= l && r <= v) return st[id][1];
Down (id);
ll mid = (l + r) >> 1;
return max (Get (id << 1, l, mid, u, v), Get (id << 1 | 1, mid + 1, r, u, v));
}
void Neg (ll id, ll l, ll r, ll u, ll v) {
if (r < u || v < l) return;
if (u <= l && r <= v) {
Lazy (id);
return;
}
Down (id);
ll mid = (l + r) >> 1;
Neg (id << 1, l, mid, u, v);
Neg (id << 1 | 1, mid + 1, r, u, v);
st[id][0] = min (st[id << 1][0], st[id << 1 | 1][0]);
st[id][1] = max (st[id << 1][1], st[id << 1 | 1][1]);
}
ll curpos = 1;
ll ID[maxN], pos[maxN];
void HLD (ll u, ll v) {
ID[u] = v;
pos[u] = curpos++;
if (!!hv[u]) HLD (hv[u], v);
for (auto v: adj[u]) if (v != par[u] && v != hv[u]) HLD (v, v);
}
void UpdPath (ll u, ll v) {
while (ID[u] != ID[v]) {
if (h[ID[u]] < h[ID[v]]) swap (u, v);
Neg (1, 1, n, pos[ID[u]], pos[u]);
u = par[ID[u]];
}
Neg (1, 1, n, min (pos[u], pos[v]) + 1, max (pos[u], pos[v]));
}
ll Query (ll u, ll v) {
ll ans = -INF;
while (ID[u] != ID[v]) {
if (h[ID[u]] < h[ID[v]]) swap (u, v);
maximize (ans, Get (1, 1, n, pos[ID[u]], pos[u]));
u = par[ID[u]];
}
return max (ans, Get (1, 1, n, min (pos[u], pos[v]) + 1, max (pos[u], pos[v])));
}
void Clear () {
curpos = 1;
FOR (i, 1, n) {
adj[i].clear ();
p[i] = {0, 0, 0};
a[i] = val[i] = edge[i] = sz[i] = par[i] = h[i] = hv[i] = ID[i] = pos[i] = 0;
}
FOR (id, 0, 4 * maxN) st[id][0] = st[id][1] = lz[id] = 0;
}
void Solve () {
cin >> t;
while (t--) {
cin >> n;
Clear ();
FOR (i, 2, n) {
cin >> u >> v >> w;
adj[u].pb (v);
adj[v].pb (u);
p[i] = {u, v, w};
}
DFS (1, -1);
HLD (1, 1);
FOR (i, 2, n) {
u = p[i].x;
v = p[i].y;
w = p[i].z;
if (u == par[v]) edge[i - 1] = v, val[v] = w;
else edge[i - 1] = u, val[u] = w;
}
FOR (i, 1, n) a[pos[i]] = val[i];
Build (1, 1, n);
while (cin >> type) {
if (type == "DONE") break;
cin >> u >> v;
if (type == "CHANGE") Upd (1, 1, n, pos[edge[u]], v);
if (type == "NEGATE") UpdPath (u, v);
if (type == "QUERY") cout << (u == v ? 0 : Query (u, v)) << '\n';
}
}
}
signed main (void) {
Mirai Kuriyama;
if (fopen (task".INP", "r")) {
freopen (task".INP", "r", stdin);
freopen (task".OUT", "w", stdout);
}
Solve ();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgovLyAgTTFuSydzIER1Y2t5IE1hc2s6ICJTdHJvbmdlc3QgTWFuIEluIFRoZSBXb3JsZCIKCi8vI3ByYWdtYSBHQ0MgdGFyZ2V0ICgiYXZ4MiIpCi8vI3ByYWdtYSBHQ0Mgb3B0aW1pemF0aW9uICgiTzMiKQovLyNwcmFnbWEgR0NDIG9wdGltaXphdGlvbiAoInVucm9sbC1sb29wcyIpCgojZGVmaW5lIHRhc2sgIlRBU0siCgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGkgYWNvcyAoLTEpCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBwbGwgcGFpciA8bGwsIGxsPgojZGVmaW5lIHBsbDIgcGFpciA8bGwsIHBsbD4KI2RlZmluZSBhbGwoYSkgYS5iZWdpbiAoKSwgYS5lbmQgKCkKI2RlZmluZSBoZWFwX21heChhKSBwcmlvcml0eV9xdWV1ZSA8YT4KI2RlZmluZSBGT1IoaSwgYSwgYikgZm9yIChsbCBpID0gKGEpOyBpIDw9IChiKTsgKytpKQojZGVmaW5lIEZPRChpLCBhLCBiKSBmb3IgKGxsIGkgPSAoYSk7IGkgPj0gKGIpOyAtLWkpCiNkZWZpbmUgRk9yKGksIGEsIGIsIGMpIGZvciAobGwgaSA9IChhKTsgaSA8PSAoYik7IGkgKz0gKGMpKQojZGVmaW5lIEZPZChpLCBhLCBiLCBjKSBmb3IgKGxsIGkgPSAoYSk7IGkgPj0gKGIpOyBpIC09IChjKSkKI2RlZmluZSBoZWFwX21pbihhKSBwcmlvcml0eV9xdWV1ZSA8YSwgdmVjdG9yIDxhPiwgZ3JlYXRlciA8YT4+CgojZGVmaW5lIE1pcmFpIGlvc19iYXNlOjogc3luY193aXRoX3N0ZGlvICgwKTsKI2RlZmluZSBLdXJpeWFtYSBjaW4udGllIChudWxscHRyKTsgY291dC50aWUgKG51bGxwdHIpOwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgbGwgSU5GID0gMWUxODsKY29uc3QgbGwgTU9EID0gMWU5ICsgNzsKY29uc3QgbGwgbWluTiA9IDFlMyArIDc7CmNvbnN0IGxsIG1heE4gPSAxZTQgKyA3Owpjb25zdCBsbCBMT0cgPSBfX2xnIChtYXhOKSArIDE7IAoKdGVtcGxhdGUgPGNsYXNzIFg+IGxsIGdldGJpdCAoWCBzLCBsbCBpKSB7IHJldHVybiAocyA+PiBpKSAmIDE7IH0KdGVtcGxhdGUgPGNsYXNzIFg+IGxsIGNudGJpdCAoWCBzKSB7IHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbCAocyk7IH0KdGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+IGJvb2wgbWF4aW1pemUgKFggJmEsIFkgYikgeyBpZiAoYSA8IGIpIHJldHVybiBhID0gYiwgMTsgcmV0dXJuIDA7IH0KdGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+IGJvb2wgbWluaW1pemUgKFggJmEsIFkgYikgeyBpZiAoYSA+IGIpIHJldHVybiBhID0gYiwgMTsgcmV0dXJuIDA7IH0KCi8vIC0tLS0tLS0tLS0tLS0tLSBNMW5LXzA4IC0tLS0tLS0tLS0tLS0tLSAvLwoKc3RyaW5nIHR5cGU7CmxsIHQsIG4sIHUsIHYsIHc7Cgp2ZWN0b3IgPGxsPiBhZGpbbWF4Tl07CmxsIGFbbWF4Tl0sIHZhbFttYXhOXSwgZWRnZVttYXhOXTsKCnN0cnVjdCBEYXRhIHsgbGwgeCwgeSwgejsgfSBwW21heE5dOwoKCmxsIHN6W21heE5dLCBwYXJbbWF4Tl0sIGhbbWF4Tl0sIGh2W21heE5dOwp2b2lkIERGUyAobGwgdSwgbGwgcCkgewogICAgc3pbdV0gPSAxOwogICAgZm9yIChhdXRvIHY6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHApIGNvbnRpbnVlOwogICAgICAgIHBhclt2XSA9IHU7CiAgICAgICAgaFt2XSA9IGhbdV0gKyAxOwogICAgICAgIERGUyAodiwgdSk7CiAgICAgICAgc3pbdV0gKz0gc3pbdl07CiAgICAgICAgaWYgKHN6W3ZdID4gc3pbaHZbdV1dKSBodlt1XSA9IHY7CiAgICB9Cn0KCmxsIHN0WzQgKiBtYXhOXVsyXSwgbHpbNCAqIG1heE5dOwp2b2lkIExhenkgKGxsIGlkKSB7CiAgICBseltpZF0gXj0gMTsKICAgIGxsIHRtcCA9IHN0W2lkXVsxXTsKICAgIHN0W2lkXVsxXSA9IC1zdFtpZF1bMF07CiAgICBzdFtpZF1bMF0gPSAtdG1wOwp9CnZvaWQgRG93biAobGwgaWQpIHsKICAgIGlmIChseltpZF0pIHsKICAgICAgICBMYXp5IChpZCA8PCAxKTsKICAgICAgICBMYXp5IChpZCA8PCAxIHwgMSk7CiAgICAgICAgbHpbaWRdID0gMDsKICAgIH0KfQp2b2lkIEJ1aWxkIChsbCBpZCwgbGwgbCwgbGwgcikgewogICAgaWYgKGwgPT0gcikgewogICAgICAgIHN0W2lkXVswXSA9IHN0W2lkXVsxXSA9IGFbbF07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbGwgbWlkID0gKGwgKyByKSA+PiAxOwogICAgQnVpbGQgKGlkIDw8IDEsIGwsIG1pZCk7CiAgICBCdWlsZCAoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIpOwogICAgc3RbaWRdWzBdID0gbWluIChzdFtpZCA8PCAxXVswXSwgc3RbaWQgPDwgMSB8IDFdWzBdKTsKICAgIHN0W2lkXVsxXSA9IG1heCAoc3RbaWQgPDwgMV1bMV0sIHN0W2lkIDw8IDEgfCAxXVsxXSk7Cn0Kdm9pZCBVcGQgKGxsIGlkLCBsbCBsLCBsbCByLCBsbCBwb3MsIGxsIHZhbCkgewogICAgaWYgKGwgPT0gcikgewogICAgICAgIHN0W2lkXVswXSA9IHN0W2lkXVsxXSA9IHZhbDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBEb3duIChpZCk7CiAgICBsbCBtaWQgPSAobCArIHIpID4+IDE7CiAgICBpZiAocG9zIDw9IG1pZCkgVXBkIChpZCA8PCAxLCBsLCBtaWQsIHBvcywgdmFsKTsKICAgIGVsc2UgVXBkIChpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgcG9zLCB2YWwpOwogICAgc3RbaWRdWzBdID0gbWluIChzdFtpZCA8PCAxXVswXSwgc3RbaWQgPDwgMSB8IDFdWzBdKTsKICAgIHN0W2lkXVsxXSA9IG1heCAoc3RbaWQgPDwgMV1bMV0sIHN0W2lkIDw8IDEgfCAxXVsxXSk7Cn0KbGwgR2V0IChsbCBpZCwgbGwgbCwgbGwgciwgbGwgdSwgbGwgdikgewogICAgaWYgKHIgPCB1IHx8IHYgPCBsKSByZXR1cm4gLUlORjsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gc3RbaWRdWzFdOwogICAgRG93biAoaWQpOwogICAgbGwgbWlkID0gKGwgKyByKSA+PiAxOwogICAgcmV0dXJuIG1heCAoR2V0IChpZCA8PCAxLCBsLCBtaWQsIHUsIHYpLCBHZXQgKGlkIDw8IDEgfCAxLCBtaWQgKyAxLCByLCB1LCB2KSk7Cn0Kdm9pZCBOZWcgKGxsIGlkLCBsbCBsLCBsbCByLCBsbCB1LCBsbCB2KSB7CiAgICBpZiAociA8IHUgfHwgdiA8IGwpIHJldHVybjsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSB7CiAgICAgICAgTGF6eSAoaWQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIERvd24gKGlkKTsKICAgIGxsIG1pZCA9IChsICsgcikgPj4gMTsKICAgIE5lZyAoaWQgPDwgMSwgbCwgbWlkLCB1LCB2KTsKICAgIE5lZyAoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHUsIHYpOwogICAgc3RbaWRdWzBdID0gbWluIChzdFtpZCA8PCAxXVswXSwgc3RbaWQgPDwgMSB8IDFdWzBdKTsKICAgIHN0W2lkXVsxXSA9IG1heCAoc3RbaWQgPDwgMV1bMV0sIHN0W2lkIDw8IDEgfCAxXVsxXSk7Cn0KCmxsIGN1cnBvcyA9IDE7CmxsIElEW21heE5dLCBwb3NbbWF4Tl07CnZvaWQgSExEIChsbCB1LCBsbCB2KSB7CiAgICBJRFt1XSA9IHY7CiAgICBwb3NbdV0gPSBjdXJwb3MrKzsKICAgIGlmICghIWh2W3VdKSBITEQgKGh2W3VdLCB2KTsKICAgIGZvciAoYXV0byB2OiBhZGpbdV0pIGlmICh2ICE9IHBhclt1XSAmJiB2ICE9IGh2W3VdKSBITEQgKHYsIHYpOwp9CnZvaWQgVXBkUGF0aCAobGwgdSwgbGwgdikgewogICAgd2hpbGUgKElEW3VdICE9IElEW3ZdKSB7CiAgICAgICAgaWYgKGhbSURbdV1dIDwgaFtJRFt2XV0pIHN3YXAgKHUsIHYpOwogICAgICAgIE5lZyAoMSwgMSwgbiwgcG9zW0lEW3VdXSwgcG9zW3VdKTsKICAgICAgICB1ID0gcGFyW0lEW3VdXTsKICAgIH0KICAgIE5lZyAoMSwgMSwgbiwgbWluIChwb3NbdV0sIHBvc1t2XSkgKyAxLCBtYXggKHBvc1t1XSwgcG9zW3ZdKSk7Cn0KbGwgUXVlcnkgKGxsIHUsIGxsIHYpIHsKICAgIGxsIGFucyA9IC1JTkY7CiAgICB3aGlsZSAoSURbdV0gIT0gSURbdl0pIHsKICAgICAgICBpZiAoaFtJRFt1XV0gPCBoW0lEW3ZdXSkgc3dhcCAodSwgdik7CiAgICAgICAgbWF4aW1pemUgKGFucywgR2V0ICgxLCAxLCBuLCBwb3NbSURbdV1dLCBwb3NbdV0pKTsKICAgICAgICB1ID0gcGFyW0lEW3VdXTsKICAgIH0KICAgIHJldHVybiBtYXggKGFucywgR2V0ICgxLCAxLCBuLCBtaW4gKHBvc1t1XSwgcG9zW3ZdKSArIDEsIG1heCAocG9zW3VdLCBwb3Nbdl0pKSk7Cn0KCnZvaWQgQ2xlYXIgKCkgewogICAgY3VycG9zID0gMTsKICAgIEZPUiAoaSwgMSwgbikgewogICAgICAgIGFkaltpXS5jbGVhciAoKTsKICAgICAgICBwW2ldID0gezAsIDAsIDB9OwogICAgICAgIGFbaV0gPSB2YWxbaV0gPSBlZGdlW2ldID0gc3pbaV0gPSBwYXJbaV0gPSBoW2ldID0gaHZbaV0gPSBJRFtpXSA9IHBvc1tpXSA9IDA7CiAgICB9CiAgICBGT1IgKGlkLCAwLCA0ICogbWF4Tikgc3RbaWRdWzBdID0gc3RbaWRdWzFdID0gbHpbaWRdID0gMDsKfQoKdm9pZCBTb2x2ZSAoKSB7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBjaW4gPj4gbjsKICAgICAgICBDbGVhciAoKTsKICAgICAgICBGT1IgKGksIDIsIG4pIHsKICAgICAgICAgICAgY2luID4+IHUgPj4gdiA+PiB3OwogICAgICAgICAgICBhZGpbdV0ucGIgKHYpOwogICAgICAgICAgICBhZGpbdl0ucGIgKHUpOwogICAgICAgICAgICBwW2ldID0ge3UsIHYsIHd9OwogICAgICAgIH0KICAgICAgICBERlMgKDEsIC0xKTsKICAgICAgICBITEQgKDEsIDEpOwogICAgICAgIEZPUiAoaSwgMiwgbikgewogICAgICAgICAgICB1ID0gcFtpXS54OwogICAgICAgICAgICB2ID0gcFtpXS55OwogICAgICAgICAgICB3ID0gcFtpXS56OwogICAgICAgICAgICBpZiAodSA9PSBwYXJbdl0pIGVkZ2VbaSAtIDFdID0gdiwgdmFsW3ZdID0gdzsKICAgICAgICAgICAgZWxzZSBlZGdlW2kgLSAxXSA9IHUsIHZhbFt1XSA9IHc7CiAgICAgICAgfQogICAgICAgIEZPUiAoaSwgMSwgbikgYVtwb3NbaV1dID0gdmFsW2ldOwogICAgICAgIEJ1aWxkICgxLCAxLCBuKTsKICAgICAgICB3aGlsZSAoY2luID4+IHR5cGUpIHsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gIkRPTkUiKSBicmVhazsKICAgICAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gIkNIQU5HRSIpIFVwZCAoMSwgMSwgbiwgcG9zW2VkZ2VbdV1dLCB2KTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gIk5FR0FURSIpIFVwZFBhdGggKHUsIHYpOwogICAgICAgICAgICBpZiAodHlwZSA9PSAiUVVFUlkiKSBjb3V0IDw8ICh1ID09IHYgPyAwIDogUXVlcnkgKHUsIHYpKSA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KfQoKc2lnbmVkIG1haW4gKHZvaWQpIHsKICAgIE1pcmFpIEt1cml5YW1hOwogICAgaWYgKGZvcGVuICh0YXNrIi5JTlAiLCAiciIpKSB7CiAgICAgICAgZnJlb3BlbiAodGFzayIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbiAodGFzayIuT1VUIiwgInciLCBzdGRvdXQpOwogICAgfSAKICAgIFNvbHZlICgpOwogICAgcmV0dXJuIDA7Cn0K