#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <climits>
using namespace std;
struct edge
{
int u, v, w, c, ci;
edge(int u, int v, int w, int c, int ci)
: u(u), v(v), w(w), c(c), ci(ci) {}
};
struct vertex
{
int p, d, se, c, ci;
vector<int> a;
vector<int> lca;
vertex():
p(-1),d(0),se(-1),c(-1),ci(-1),a(),lca() {}
};
struct chain
{
int je, h;
vector<int> e, st;
chain(int je, int h): je(je), h(h) {}
};
struct graph
{
vector<edge> e;
vector<vertex> v;
vector<chain> c;
};
void hld(int u, int c, int ci, graph& g);
int dfs(int u, int p, graph& g);
int log2(int n);
void comp_lca(graph &g);
int lca(int u, int v, graph &g);
void create_sts(graph &g);
int build_st(int ci, int idx, int l, int r, graph &g);
void update(int ci, int idx, int l, int r, int i, int nv, graph& g);
int path_max(int u, int v, graph& g);
int main()
{
int t, n, u, v, w;
graph g;
char q[10];
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
g.e.clear();
g.v.clear();
g.c.clear();
g.v.resize(n, vertex());
for(int i = 0; i < n-1; i++)
{
scanf("%d %d %d", &u, &v, &w);
u--; v--;
g.e.push_back(edge(u, v, w, -1, -1));
g.v[u].a.push_back(i);
g.v[v].a.push_back(i);
}
dfs(0, -1, g);
g.c.push_back(chain(-1, 0));
hld(0, 0, 0, g);
comp_lca(g);
create_sts(g);
while(true)
{
scanf("%s", q);
if(strcmp(q, "DONE") == 0)
break;
scanf("%d %d", &u, &v);
if(strcmp(q, "QUERY") == 0)
{
u--; v--;
w = lca(u, v, g);
if(u == v)
printf("0\n");
else
printf("%d\n", max(path_max(u, w, g), path_max(v, w, g)));
}
if(strcmp(q, "CHANGE") == 0)
{
u--;
g.e[u].w = v;
if(g.e[u].c != -1)
update(g.e[u].c,
0, 0, g.c[g.e[u].c].e.size()-1,
g.e[u].ci, v, g);
}
}
}
return 0;
}
int dfs(int u, int p, graph& g)
{
int count, m_count, t_count, v, se;
vector<int>::iterator it;
count = 1;
m_count = 0;
se = -1;
g.v[u].p = p;
g.v[u].d = p == -1 ? 1 : g.v[p].d + 1;
for(it = g.v[u].a.begin(); it != g.v[u].a.end(); it++)
{
v = u ^ g.e[*it].u ^ g.e[*it].v;
if(v == p)
continue;
t_count = dfs(v, u, g);
count += t_count;
if(t_count > m_count)
{
m_count = t_count;
se = *it;
}
}
g.v[u].se = se;
return count;
}
void hld(int u, int c, int ci, graph& g)
{
int v, se;
vector<int>::iterator it;
g.v[u].c = c;
g.v[u].ci = ci;
se = g.v[u].se;
if(se == -1)
return;
v = u ^ g.e[se].u ^ g.e[se].v;
g.e[se].c = c;
g.c[c].e.push_back(se);
g.e[se].ci = g.c[c].e.size()-1;
hld(v, c, ci+1, g);
for(it = g.v[u].a.begin(); it != g.v[u].a.end(); it++)
{
v = u ^ g.e[*it].u ^ g.e[*it].v;
if(v == g.v[u].p || *it == se)
continue;
g.c.push_back(chain(*it, v));
hld(v, g.c.size()-1, 0, g);
}
}
int log2(int n)
{
int e = 0, te = 1;
while(te < n)
{
te *= 2;
e++;
}
return e;
}
void comp_lca(graph &g)
{
int maxj = log2(g.v.size());
for(int i = 0; i < g.v.size(); i++)
{
g.v[i].lca.resize(maxj+1, -1);
g.v[i].lca[0] = g.v[i].p;
}
for(int j = 1; j <= maxj; j++)
{
for(int i = 0; i < g.v.size(); i++)
{
if(g.v[i].lca[j-1] != -1)
g.v[i].lca[j] = g.v[g.v[i].lca[j-1]].lca[j-1];
else
g.v[i].lca[j] = -1;
}
}
}
int lca(int u, int v, graph &g)
{
int diff = g.v[v].d - g.v[u].d, j;
if(diff < 0)
return lca(v, u, g);
j = 0;
while(diff > 0)
{
if(diff % 2)
v = g.v[v].lca[j];
diff /= 2;
j++;
}
if(u == v)
return u;
while(g.v[u].p != g.v[v].p)
{
j = 0;
while(g.v[u].lca[j] != g.v[v].lca[j])
j++;
u = g.v[u].lca[j-1];
v = g.v[v].lca[j-1];
}
return g.v[u].p;
}
void create_sts(graph& g)
{
for(int i = 0; i < g.c.size(); i++)
{
if(g.c[i].e.size() == 0)
continue;
g.c[i].st.resize(4*g.c[i].e.size(), 0);
build_st(i, 0, 0, g.c[i].e.size()-1, g);
}
}
int build_st(int ci, int idx, int l, int r, graph &g)
{
int ridx, lidx, mid;
lidx = (idx<<1)+1;
ridx = lidx+1;
mid = (l+r)>>1;
if(l==r)
{
g.c[ci].st[idx] = g.e[g.c[ci].e[l]].w;
return g.c[ci].st[idx];
}
g.c[ci].st[idx] = max(
build_st(ci, lidx, l, mid, g),
build_st(ci, ridx, mid+1, r, g));
}
int query(int ci, int idx, int l, int r, int a, int b, graph& g)
{
int lidx, ridx, mid, mx = INT_MIN;
lidx = (idx<<1)+1;
ridx = lidx+1;
mid = (l+r)>>1;
if(l==a && r==b)
return g.c[ci].st[idx];
if(a <= mid)
mx = max(mx, query(ci, lidx, l, mid, a, min(mid,b), g));
if(b > mid)
mx = max(mx, query(ci, ridx, mid+1, r, max(mid+1, a), b, g));
return mx;
}
void update(int ci, int idx, int l, int r, int i, int nv, graph& g)
{
int lidx, ridx, mid;
lidx = (idx<<1)+1;
ridx = lidx + 1;
mid = (l+r)>>1;
if(l==r)
{
g.c[ci].st[idx] = nv;
return;
}
if(i <= mid)
update(ci, lidx, l, mid, i, nv, g);
else
update(ci, ridx, mid+1, r, i, nv, g);
g.c[ci].st[idx] = max(g.c[ci].st[lidx], g.c[ci].st[ridx]);
}
int path_max(int u, int v, graph &g)
{
int mx = INT_MIN, i, j;
while(true)
{
if(u == v)
return mx;
i = g.v[u].c == g.v[v].c ? g.v[v].ci : 0;
j = g.v[u].ci - 1;
if(j >= 0)
mx = max(mx, query(g.v[u].c,
0, 0, g.c[g.v[u].c].e.size()-1,
i, j, g));
if(g.v[u].c == g.v[v].c)
return mx;
mx = max(mx, g.e[g.c[g.v[u].c].je].w);
u = g.v[g.c[g.v[u].c].h].p;
}
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjbGltaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBlZGdlCnsKICAgIGludCB1LCB2LCB3LCBjLCBjaTsKICAgIGVkZ2UoaW50IHUsIGludCB2LCBpbnQgdywgaW50IGMsIGludCBjaSkKICAgICAgICA6IHUodSksIHYodiksIHcodyksIGMoYyksIGNpKGNpKSB7fQp9OwoKc3RydWN0IHZlcnRleAp7CiAgICBpbnQgcCwgZCwgc2UsIGMsIGNpOwogICAgdmVjdG9yPGludD4gYTsKICAgIHZlY3RvcjxpbnQ+IGxjYTsKICAgIHZlcnRleCgpOgogICAgICAgIHAoLTEpLGQoMCksc2UoLTEpLGMoLTEpLGNpKC0xKSxhKCksbGNhKCkge30KfTsKCnN0cnVjdCBjaGFpbgp7CiAgICBpbnQgamUsIGg7CiAgICB2ZWN0b3I8aW50PiBlLCBzdDsKICAgIGNoYWluKGludCBqZSwgaW50IGgpOiBqZShqZSksIGgoaCkge30KfTsKCnN0cnVjdCBncmFwaAp7CiAgICB2ZWN0b3I8ZWRnZT4gZTsKICAgIHZlY3Rvcjx2ZXJ0ZXg+IHY7CiAgICB2ZWN0b3I8Y2hhaW4+IGM7Cn07Cgp2b2lkIGhsZChpbnQgdSwgaW50IGMsIGludCBjaSwgZ3JhcGgmIGcpOwppbnQgZGZzKGludCB1LCBpbnQgcCwgZ3JhcGgmIGcpOwppbnQgbG9nMihpbnQgbik7CnZvaWQgY29tcF9sY2EoZ3JhcGggJmcpOwppbnQgbGNhKGludCB1LCBpbnQgdiwgZ3JhcGggJmcpOwp2b2lkIGNyZWF0ZV9zdHMoZ3JhcGggJmcpOwppbnQgYnVpbGRfc3QoaW50IGNpLCBpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGdyYXBoICZnKTsKdm9pZCB1cGRhdGUoaW50IGNpLCBpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGludCBpLCBpbnQgbnYsIGdyYXBoJiBnKTsKaW50IHBhdGhfbWF4KGludCB1LCBpbnQgdiwgZ3JhcGgmIGcpOwoKaW50IG1haW4oKQp7CiAgICBpbnQgdCwgbiwgdSwgdiwgdzsKICAgIGdyYXBoIGc7CiAgICBjaGFyIHFbMTBdOwoKICAgIHNjYW5mKCIlZCIsICZ0KTsKICAgIHdoaWxlKHQtLSkKICAgIHsKICAgICAgICBzY2FuZigiJWQiLCAmbik7CgogICAgICAgIGcuZS5jbGVhcigpOwogICAgICAgIGcudi5jbGVhcigpOwogICAgICAgIGcuYy5jbGVhcigpOwogICAgICAgIGcudi5yZXNpemUobiwgdmVydGV4KCkpOwogICAgICAgIAogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuLTE7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHNjYW5mKCIlZCAlZCAlZCIsICZ1LCAmdiwgJncpOwogICAgICAgICAgICB1LS07IHYtLTsKICAgICAgICAgICAgZy5lLnB1c2hfYmFjayhlZGdlKHUsIHYsIHcsIC0xLCAtMSkpOwogICAgICAgICAgICBnLnZbdV0uYS5wdXNoX2JhY2soaSk7CiAgICAgICAgICAgIGcudlt2XS5hLnB1c2hfYmFjayhpKTsKICAgICAgICB9CgogICAgICAgIGRmcygwLCAtMSwgZyk7ICAgICAgICAKICAgICAgICBnLmMucHVzaF9iYWNrKGNoYWluKC0xLCAwKSk7CiAgICAgICAgaGxkKDAsIDAsIDAsIGcpOwogICAgICAgIGNvbXBfbGNhKGcpOwogICAgICAgIGNyZWF0ZV9zdHMoZyk7CgogICAgICAgIHdoaWxlKHRydWUpCiAgICAgICAgewogICAgICAgICAgICBzY2FuZigiJXMiLCBxKTsKCiAgICAgICAgICAgIGlmKHN0cmNtcChxLCAiRE9ORSIpID09IDApCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIHNjYW5mKCIlZCAlZCIsICZ1LCAmdik7CgogICAgICAgICAgICBpZihzdHJjbXAocSwgIlFVRVJZIikgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdS0tOyB2LS07CiAgICAgICAgICAgICAgICB3ID0gbGNhKHUsIHYsIGcpOwogICAgICAgICAgICAgICAgaWYodSA9PSB2KQogICAgICAgICAgICAgICAgICAgIHByaW50ZigiMFxuIik7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZFxuIiwgbWF4KHBhdGhfbWF4KHUsIHcsIGcpLCBwYXRoX21heCh2LCB3LCBnKSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihzdHJjbXAocSwgIkNIQU5HRSIpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHUtLTsKICAgICAgICAgICAgICAgIGcuZVt1XS53ID0gdjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYoZy5lW3VdLmMgIT0gLTEpCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlKGcuZVt1XS5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBnLmNbZy5lW3VdLmNdLmUuc2l6ZSgpLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZVt1XS5jaSwgdiwgZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICAgICAgICAKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKaW50IGRmcyhpbnQgdSwgaW50IHAsIGdyYXBoJiBnKQp7CiAgICBpbnQgY291bnQsIG1fY291bnQsIHRfY291bnQsIHYsIHNlOwogICAgdmVjdG9yPGludD46Oml0ZXJhdG9yIGl0OwoKICAgIGNvdW50ID0gMTsKICAgIG1fY291bnQgPSAwOwogICAgc2UgPSAtMTsKICAgIGcudlt1XS5wID0gcDsKICAgIGcudlt1XS5kID0gcCA9PSAtMSA/IDEgOiBnLnZbcF0uZCArIDE7CgogICAgZm9yKGl0ID0gZy52W3VdLmEuYmVnaW4oKTsgaXQgIT0gZy52W3VdLmEuZW5kKCk7IGl0KyspCiAgICB7CiAgICAgICAgdiA9IHUgXiBnLmVbKml0XS51IF4gZy5lWyppdF0udjsKCiAgICAgICAgaWYodiA9PSBwKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgdF9jb3VudCA9IGRmcyh2LCB1LCBnKTsKICAgICAgICBjb3VudCArPSB0X2NvdW50OwoKICAgICAgICBpZih0X2NvdW50ID4gbV9jb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIG1fY291bnQgPSB0X2NvdW50OwogICAgICAgICAgICBzZSA9ICppdDsKICAgICAgICB9CiAgICB9CgogICAgZy52W3VdLnNlID0gc2U7CiAgICByZXR1cm4gY291bnQ7Cn0KCnZvaWQgaGxkKGludCB1LCBpbnQgYywgaW50IGNpLCBncmFwaCYgZykKewogICAgaW50IHYsIHNlOwogICAgdmVjdG9yPGludD46Oml0ZXJhdG9yIGl0OwoKICAgIGcudlt1XS5jID0gYzsKICAgIGcudlt1XS5jaSA9IGNpOwogICAgc2UgPSBnLnZbdV0uc2U7CiAgICAKICAgIGlmKHNlID09IC0xKQogICAgICAgIHJldHVybjsKICAgICAgICAKICAgIHYgPSB1IF4gZy5lW3NlXS51IF4gZy5lW3NlXS52OwogICAgZy5lW3NlXS5jID0gYzsKICAgIGcuY1tjXS5lLnB1c2hfYmFjayhzZSk7CiAgICBnLmVbc2VdLmNpID0gZy5jW2NdLmUuc2l6ZSgpLTE7CgogICAgCiAgICBobGQodiwgYywgY2krMSwgZyk7CgogICAgZm9yKGl0ID0gZy52W3VdLmEuYmVnaW4oKTsgaXQgIT0gZy52W3VdLmEuZW5kKCk7IGl0KyspCiAgICB7CiAgICAgICAgdiA9IHUgXiBnLmVbKml0XS51IF4gZy5lWyppdF0udjsKICAgICAgICAKICAgICAgICBpZih2ID09IGcudlt1XS5wIHx8ICppdCA9PSBzZSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgCiAgICAgICAgZy5jLnB1c2hfYmFjayhjaGFpbigqaXQsIHYpKTsKICAgICAgICBobGQodiwgZy5jLnNpemUoKS0xLCAwLCBnKTsKICAgIH0KfQoKaW50IGxvZzIoaW50IG4pCnsKICAgIGludCBlID0gMCwgdGUgPSAxOwogICAgd2hpbGUodGUgPCBuKQogICAgewogICAgICAgIHRlICo9IDI7CiAgICAgICAgZSsrOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCnZvaWQgY29tcF9sY2EoZ3JhcGggJmcpCnsKICAgIGludCBtYXhqID0gbG9nMihnLnYuc2l6ZSgpKTsKCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgZy52LnNpemUoKTsgaSsrKQogICAgewogICAgICAgIGcudltpXS5sY2EucmVzaXplKG1heGorMSwgLTEpOwogICAgICAgIGcudltpXS5sY2FbMF0gPSBnLnZbaV0ucDsKICAgIH0KICAgICAgICAgICAgCiAgICBmb3IoaW50IGogPSAxOyBqIDw9IG1heGo7IGorKykKICAgIHsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZy52LnNpemUoKTsgaSsrKQogICAgICAgIHsgICAgICAgICAgICAKICAgICAgICAgICAgaWYoZy52W2ldLmxjYVtqLTFdICE9IC0xKQogICAgICAgICAgICAgICAgZy52W2ldLmxjYVtqXSA9IGcudltnLnZbaV0ubGNhW2otMV1dLmxjYVtqLTFdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnLnZbaV0ubGNhW2pdID0gLTE7CiAgICAgICAgfQogICAgfQp9CgppbnQgbGNhKGludCB1LCBpbnQgdiwgZ3JhcGggJmcpCnsKICAgIGludCBkaWZmID0gZy52W3ZdLmQgLSBnLnZbdV0uZCwgajsKCiAgICBpZihkaWZmIDwgMCkKICAgICAgICByZXR1cm4gbGNhKHYsIHUsIGcpOwoKICAgIGogPSAwOwogICAgd2hpbGUoZGlmZiA+IDApCiAgICB7CiAgICAgICAgaWYoZGlmZiAlIDIpCiAgICAgICAgICAgIHYgPSBnLnZbdl0ubGNhW2pdOwogICAgICAgIGRpZmYgLz0gMjsKICAgICAgICBqKys7CiAgICB9CgogICAgaWYodSA9PSB2KQogICAgICAgIHJldHVybiB1OwogICAgCiAgICB3aGlsZShnLnZbdV0ucCAhPSBnLnZbdl0ucCkKICAgIHsKICAgICAgICBqID0gMDsKICAgICAgICB3aGlsZShnLnZbdV0ubGNhW2pdICE9IGcudlt2XS5sY2Fbal0pCiAgICAgICAgICAgIGorKzsKICAgICAgICB1ID0gZy52W3VdLmxjYVtqLTFdOwogICAgICAgIHYgPSBnLnZbdl0ubGNhW2otMV07CiAgICB9CgogICAgcmV0dXJuIGcudlt1XS5wOwp9Cgp2b2lkIGNyZWF0ZV9zdHMoZ3JhcGgmIGcpCnsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBnLmMuc2l6ZSgpOyBpKyspCiAgICB7CiAgICAgICAgaWYoZy5jW2ldLmUuc2l6ZSgpID09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIAogICAgICAgIGcuY1tpXS5zdC5yZXNpemUoNCpnLmNbaV0uZS5zaXplKCksIDApOwogICAgICAgIGJ1aWxkX3N0KGksIDAsIDAsIGcuY1tpXS5lLnNpemUoKS0xLCBnKTsKICAgIH0gICAgCn0KCmludCBidWlsZF9zdChpbnQgY2ksIGludCBpZHgsIGludCBsLCBpbnQgciwgZ3JhcGggJmcpCnsKICAgIGludCByaWR4LCBsaWR4LCBtaWQ7CgogICAgbGlkeCA9IChpZHg8PDEpKzE7CiAgICByaWR4ID0gbGlkeCsxOwogICAgbWlkID0gKGwrcik+PjE7CiAgICAKICAgIGlmKGw9PXIpCiAgICB7CiAgICAgICAgZy5jW2NpXS5zdFtpZHhdID0gZy5lW2cuY1tjaV0uZVtsXV0udzsKICAgICAgICByZXR1cm4gZy5jW2NpXS5zdFtpZHhdOwogICAgfQoKICAgIGcuY1tjaV0uc3RbaWR4XSA9IG1heCgKICAgICAgICBidWlsZF9zdChjaSwgbGlkeCwgbCwgbWlkLCBnKSwKICAgICAgICBidWlsZF9zdChjaSwgcmlkeCwgbWlkKzEsIHIsIGcpKTsKfQoKaW50IHF1ZXJ5KGludCBjaSwgaW50IGlkeCwgaW50IGwsIGludCByLCBpbnQgYSwgaW50IGIsIGdyYXBoJiBnKQp7CiAgICBpbnQgbGlkeCwgcmlkeCwgbWlkLCBteCA9IElOVF9NSU47CgogICAgbGlkeCA9IChpZHg8PDEpKzE7CiAgICByaWR4ID0gbGlkeCsxOwogICAgbWlkID0gKGwrcik+PjE7CgogICAgaWYobD09YSAmJiByPT1iKQogICAgICAgIHJldHVybiBnLmNbY2ldLnN0W2lkeF07CiAgICBpZihhIDw9IG1pZCkKICAgICAgICBteCA9IG1heChteCwgcXVlcnkoY2ksIGxpZHgsIGwsIG1pZCwgYSwgbWluKG1pZCxiKSwgZykpOwogICAgaWYoYiA+IG1pZCkKICAgICAgICBteCA9IG1heChteCwgcXVlcnkoY2ksIHJpZHgsIG1pZCsxLCByLCBtYXgobWlkKzEsIGEpLCBiLCBnKSk7CiAgICByZXR1cm4gbXg7Cn0KCnZvaWQgdXBkYXRlKGludCBjaSwgaW50IGlkeCwgaW50IGwsIGludCByLCBpbnQgaSwgaW50IG52LCBncmFwaCYgZykKewogICAgaW50IGxpZHgsIHJpZHgsIG1pZDsKCiAgICBsaWR4ID0gKGlkeDw8MSkrMTsKICAgIHJpZHggPSBsaWR4ICsgMTsKICAgIG1pZCA9IChsK3IpPj4xOwogICAgCiAgICBpZihsPT1yKQogICAgewogICAgICAgIGcuY1tjaV0uc3RbaWR4XSA9IG52OwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZihpIDw9IG1pZCkKICAgICAgICB1cGRhdGUoY2ksIGxpZHgsIGwsIG1pZCwgaSwgbnYsIGcpOwogICAgZWxzZSAgICAgICAgCiAgICAgICAgdXBkYXRlKGNpLCByaWR4LCBtaWQrMSwgciwgaSwgbnYsIGcpOwoKICAgIGcuY1tjaV0uc3RbaWR4XSA9IG1heChnLmNbY2ldLnN0W2xpZHhdLCBnLmNbY2ldLnN0W3JpZHhdKTsgICAgCn0KCmludCBwYXRoX21heChpbnQgdSwgaW50IHYsIGdyYXBoICZnKQp7CiAgICBpbnQgbXggPSBJTlRfTUlOLCBpLCBqOwogICAgCiAgICB3aGlsZSh0cnVlKQogICAgewogICAgICAgIGlmKHUgPT0gdikKICAgICAgICAgICAgcmV0dXJuIG14OwoKICAgICAgICBpID0gZy52W3VdLmMgPT0gZy52W3ZdLmMgPyBnLnZbdl0uY2kgOiAwOwogICAgICAgIGogPSBnLnZbdV0uY2kgLSAxOwogICAgICAgIGlmKGogPj0gMCkKICAgICAgICAgICAgbXggPSBtYXgobXgsIHF1ZXJ5KGcudlt1XS5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgZy5jW2cudlt1XS5jXS5lLnNpemUoKS0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgZykpOwoKICAgICAgICBpZihnLnZbdV0uYyA9PSBnLnZbdl0uYykKICAgICAgICAgICAgcmV0dXJuIG14OwogICAgICAgIAogICAgICAgIG14ID0gbWF4KG14LCBnLmVbZy5jW2cudlt1XS5jXS5qZV0udyk7CiAgICAgICAgdSA9IGcudltnLmNbZy52W3VdLmNdLmhdLnA7CiAgICB9Cn0K