#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,k,r,p,vst;
ll a[200005];
int fa[200005],hs[200005],sz[200005],top[200005],dfn[200005],rdfn[200005],dep[200005];
vector<int>G[200005];
void dfs(int u,int fat) {
fa[u]=fat;
sz[u]=1;
dep[u]=dep[fat]+1;
for(auto &v:G[u]) {
if(v==fat)continue;
dfs(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[hs[u]])hs[u]=v;
}
}
void cut(int u,int tp) {
dfn[u]=++vst;
rdfn[vst]=u;
top[u]=tp;
if(hs[u]) {
cut(hs[u],tp);
for(auto &v:G[u])if(v!=fa[u]&&v!=hs[u])cut(v,v);
}
}
ll tr[800020],trr[800020],tg[800020],tg2[800020];
void pup(int u) {
tr[u]=tr[u<<1]+tr[u<<1|1];
trr[u]=max(trr[u<<1],trr[u<<1|1]);
}
void gt(int u,int len,ll x) {
tg[u]+=x;
tr[u]+=len*x;
trr[u]+=x;
}
void gt2(int u,int len,ll x) {
tg2[u]=x;
tr[u]=len*x;
trr[u]=x;
tg[u]=0;
}
void pdn(int u,int le,int ri) {
int mid=(le+ri)>>1;
gt(u<<1,mid-le+1,tg[u]);
gt(u<<1|1,ri-mid,tg[u]);
tg[u]=0;
}
void pdn2(int u,int le,int ri) {
int mid=(le+ri)>>1;
gt2(u<<1,mid-le+1,tg2[u]);
gt2(u<<1|1,ri-mid,tg2[u]);
tg2[u]=0;
}
void build(int u,int le,int ri) {
if(le==ri) {
tr[u]=trr[u]=a[rdfn[le]];
return;
}
int mid=(le+ri)>>1;
build(u<<1,le,mid);
build(u<<1|1,mid+1,ri);
pup(u);
}
bool inr(int le,int ri,int L,int R) {
return (L<=le)&&(ri<=R);
}
bool otr(int le,int ri,int L,int R) {
return (le>R)||(ri<L);
}
ll query(int u,int le,int ri,int L,int R) {
if(inr(le,ri,L,R))return tr[u];
else if(!otr(le,ri,L,R)) {
int mid=(le+ri)>>1;
return (query(u<<1,le,mid,L,R)+query(u<<1|1,mid+1,ri,L,R));
}
return 0;
}
ll qry(int x,int y) {
ll ans=0;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=query(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
return (ans+query(1,1,n,min(dfn[x],dfn[y]),max(dfn[x],dfn[y])));
}
ll query2(int u,int le,int ri,int L,int R) {
if(inr(le,ri,L,R))return trr[u];
else if(!otr(le,ri,L,R)) {
int mid=(le+ri)>>1;
return max(query2(u<<1,le,mid,L,R),query2(u<<1|1,mid+1,ri,L,R));
}
return -1;
}
ll qry2(int x,int y) {
ll ans=INT_MIN;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,query2(1,1,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
return max(ans,query2(1,1,n,min(dfn[x],dfn[y]),max(dfn[x],dfn[y])));
}
void update(int u,int le,int ri,int L,int R,ll x) {
if(inr(le,ri,L,R))gt(u,ri-le+1,x);
else if(!otr(le,ri,L,R)) {
int mid=(le+ri)>>1;
pdn(u,le,ri);
update(u<<1,le,mid,L,R,x);
update(u<<1|1,mid+1,ri,L,R,x);
pup(u);
}
}
void ud(int u,int v,int x){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
update(1,1,n,dfn[top[u]],dfn[u],x);
u=fa[top[u]];
}
update(1,1,n,min(dfn[u],dfn[v]),max(dfn[u],dfn[v]),x);
}
void update2(int u,int le,int ri,int L,int R,ll x) {
if(inr(le,ri,L,R))gt2(u,ri-le+1,x);
else if(!otr(le,ri,L,R)) {
int mid=(le+ri)>>1;
pdn2(u,le,ri);
update2(u<<1,le,mid,L,R,x);
update2(u<<1|1,mid+1,ri,L,R,x);
pup(u);
}
}
void ud2(int u,int v,int x){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
update2(1,1,n,dfn[top[u]],dfn[u],x);
u=fa[top[u]];
}
update2(1,1,n,min(dfn[u],dfn[v]),max(dfn[u],dfn[v]),x);
}
struct ed{
int u,v,w;
}aa[100005];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
r=1;
cin>>n;
m=1000000;
for(int i=1; i<n; i++) {
int u,v,w;
cin>>u>>v>>w;
aa[i].u=u;
aa[i].v=v;
aa[i].w=w;
a[aa[i].v]+=aa[i].w;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(r,0);
cut(r,0);
build(1,1,n);
while(m--) {
string ord;
cin>>ord;
if(ord=="Change"){
int k,w;
cin>>k>>w;
ud2(aa[k].v,aa[k].v,w);
}else if(ord=="Cover"){
int u,v,w;
cin>>u>>v>>w;
int tp=qry(u,u);
ud2(u,v,w);
ud2(u,u,tp);
}else if(ord=="Add"){
int u,v,w;
cin>>u>>v>>w;
ud(u,v,w);
ud(u,u,-w);
}else if(ord=="Max"){
int u,v;
cin>>u>>v;
cout<<qry2(u,v)<<"\n";
}else break;
}
}