WA 0pts
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 100005;
inline LL Read();void Rite(LL x);
int a[maxn],c[maxn],n;
int head[maxn],cnt(-1);
int fth[maxn],dep[maxn],dfn[maxn];
int siz[maxn],son[maxn],top[maxn];
int ti = 0;
struct node{
int u,to,nxt,cst;
}edge[maxn * 2];
struct SegmentTree{
int left,right;
LL data;
#define l(p) t[p].left
#define r(p) t[p].right
#define d(p) t[p].data
}t[maxn * 4];
void Input(int u,int v,int w){
edge[++cnt] = {u,v,head[u],w};
head[u] = cnt;
}
void DFS1(int u,int fa){
dep[u] = dep[fa] + 1;
siz[u] = 1;
fth[u] = fa;
for(int i = head[u];~i;i = edge[i].nxt){
int v = edge[i].to;
if(v == fa) continue;
c[v] = edge[i].cst;
DFS1(v,u);
siz[u] += siz[v];
if(!son[u] || siz[son[u]] < siz[v])
son[u] = v;
}
}
void DFS2(int u,int tp){
dfn[u] = ++ti;
a[ti] = c[u];
top[u] = tp;
if(!son[u]) return;
DFS2(son[u],tp);
for(int i = head[u];~i;i = edge[i].nxt){
int v = edge[i].to;
if(son[u] != v && fth[u] != v)
DFS2(v,v);
}
}
void Build(int p,int l,int r){
l(p) = l; r(p) = r;
if(l == r){d(p) = a[l];return;}
int mid = (l + r) / 2;
Build(p * 2,l,mid);
Build(p*2+1,mid + 1,r);
d(p) = max(d(p * 2),d(p*2+1));
}
void Change(int p,int l,LL d){
if(l(p) == r(p)){d(p) = max(d,d(p));return;}
int mid = (l(p) + r(p)) / 2;
if(l <= mid) Change(p * 2,l,d);
else Change(p*2+1,l,d);
d(p) = max(d(p * 2),d(p*2+1));
}
LL Ask(int p,int l,int r){
if(l <= l(p) && r >= r(p))
return d(p);
LL ans(INT_MIN);
int mid = (l(p) + r(p)) / 2;
if(l <= mid) ans = max(ans,Ask(p * 2,l,r));
if(r > mid) ans = max(ans,Ask(p*2+1,l,r));
return ans;
}
LL Query(int u,int v){
if(u == v) return 0;
LL ans(0);
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
ans = max(ans,Ask(1,dfn[top[u]],dfn[u]));
u = fth[top[u]];
}
if(dep[u] > dep[v]) swap(u,v);
ans = max(ans,Ask(1,dfn[u] + 1,dfn[v]));
return ans;
}
int main(){
n = Read();
memset(head,-1,sizeof(head));
for(int i = 1;i <= n - 1;++i){
int u(Read()),v(Read()),w(Read());
Input(u,v,w); Input(v,u,w);
}
DFS1(1,0); DFS2(1,1); Build(1,1,n);
while(1){
string s; cin >> s;
if(s[0] == 'D') break;
int x(Read()),y(Read());
if(s[0] == 'C'){
x = (x - 1) * 2;
int u(edge[x].u),v(edge[x].to);
if(fth[v] == u) swap(u,v);
Change(1,dfn[u],y);
}
else Rite(Query(x,y)),putchar('\n');
}
return 0;
}
inline LL Read(){
char c = getchar();
LL x = 0,f = 1;
while(c < '0' || c > '9'){
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}void Rite(LL x){
if(x < 0) putchar('-'),x = -x;
if(x > 9) Rite(x / 10);
putchar(x % 10 + '0');
}