#include<bits/stdc++.h>
#define N 1000006
#define int long long
#define mid ((l+r)>>1)
#define lp (p<<1)
#define rp (p<<1|1)
using namespace std;
int re(){
int x=0,p=1;
char y=getchar();
for(;y<'0'||y>'9';y=getchar())
if(y=='-')
p=-p;
for(;y>='0'&&y<='9';y=getchar())
x=x*10+y-'0';
return x*p;
}
void wr(int x){
if(x<0)
putchar('-'),x=-x;
if(x>9)
wr(x/10);
putchar(x%10+'0');
}
int n,m;
int cnt,num;
int val[N];
int Maxx[N];
int add[N],cha[N];
int fir[N],nex[N],poi[N],poi_val[N];
int fa[N],son[N],dep[N],siz[N];
int dfn[N],top[N],rnk[N];
void dfs_1(int x,int f){
fa[x]=f;siz[x]=1;
dep[x]=dep[f]+1;
for(int i=fir[x];i;i=nex[i]){
int p=poi[i];
if(p==f)
continue;
dfs_1(p,x);poi_val[p]=val[i];
siz[x]+=siz[p];
if(siz[son[x]]<siz[p])
son[x]=p;
}
}
void dfs_2(int x,int topn){
top[x]=topn;
dfn[x]=++num;rnk[num]=x;
if(!son[x])
return;
dfs_2(son[x],topn);
for(int i=fir[x];i;i=nex[i]){
int p=poi[i];
if(dfn[p])
continue;
dfs_2(p,p);
}
}
void ins(int x,int y,int z){
nex[++cnt]=fir[x];
fir[x]=cnt;
poi[cnt]=y;
val[cnt]=z;
}
void Push_up(int p){
Maxx[p]=max(Maxx[lp],Maxx[rp]);
}
void Push_add(int p,int k){
Maxx[p]+=k;
add[p]+=k;
}
void Push_change(int p,int k){
if(k==-1)
return;
Maxx[p]=k;
cha[p]=k;
add[p]=0;
}
void Build(int l,int r,int p){
cha[p]=-1;
if(l==r){
Maxx[p]=poi_val[rnk[l]];
return;
}
Build(l,mid,lp);
Build(mid+1,r,rp);
Push_up(p);
}
void Push_down(int p){
Push_change(lp,cha[p]);
Push_change(rp,cha[p]);
Push_add(lp,add[p]);
Push_add(rp,add[p]);
add[p]=0;cha[p]=-1;
}
void Add(int al,int ar,int l,int r,int p,int k){
if(al<=l&&ar>=r){
Push_add(p,k);
return;
}
Push_down(p);
if(al<=mid)
Add(al,ar,l,mid,lp,k);
if(ar>mid)
Add(al,ar,mid+1,r,rp,k);
Push_up(p);
}
int Ask(int al,int ar,int l,int r,int p){
if(al<=l&&ar>=r)
return Maxx[p];
Push_down(p);
int maxx=-10000000;
if(al<=mid)
maxx=max(maxx,Ask(al,ar,l,mid,lp));
if(ar>mid)
maxx=max(maxx,Ask(al,ar,mid+1,r,rp));
return maxx;
}
void Change(int al,int ar,int l,int r,int p,int k){
if(al<=l&&ar>=r){
Push_change(p,k);
return;
}
Push_down(p);
if(al<=mid)
Change(al,ar,l,mid,lp,k);
if(ar>mid)
Change(al,ar,mid+1,r,rp,k);
Push_up(p);
}
void Lchange(int x,int y,int k){
for(;top[x]^top[y];x=fa[top[x]]){
if(dep[top[x]]<dep[top[y]])
x^=y^=x^=y;
Change(dfn[top[x]],dfn[x],1,n,1,k);
}
if(dep[x]>dep[y])
x^=y^=x^=y;
Change(dfn[x]+1,dfn[y],1,n,1,k);
}
void Lcadd(int x,int y,int k){
for(;top[x]^top[y];x=fa[top[x]]){
if(dep[top[x]]<dep[top[y]])
x^=y^=x^=y;
Add(dfn[top[x]],dfn[x],1,n,1,k);
}
if(dep[x]>dep[y])
x^=y^=x^=y;
Add(dfn[x]+1,dfn[y],1,n,1,k);
}
int Lcask(int x,int y){
int maxx=-1000000;
for(;top[x]^top[y];x=fa[top[x]]){
if(dep[top[x]]<dep[top[y]])
x^=y^=x^=y;
maxx=max(maxx,Ask(dfn[top[x]],dfn[x],1,n,1));
}
if(dep[x]>dep[y])
x^=y^=x^=y;
maxx=max(maxx,Ask(dfn[x]+1,dfn[y],1,n,1));
return maxx;
}
signed main()
{
n=re();
for(int i=1;i<n;i++){
int u=re(),v=re(),w=re();
ins(u,v,w),ins(v,u,w);
}
dfs_1(1,1);dfs_2(1,1);
Build(1,n,1);
int flag=0;
while(flag!=1){
string s;
cin>>s;
if(s=="Change"){
int x=re(),k=re(),H;
if(poi[x*2]==fa[poi[x*2-1]])
H=poi[x*2-1];
else
H=poi[x*2];
Change(H,H,1,n,1,k);
}
if(s=="Cover"){
int x=re(),y=re(),k=re();
Lchange(x,y,k);
}
if(s=="Add"){
int x=re(),y=re(),k=re();
Lcadd(x,y,k);
}
if(s=="Max"){
int x=re(),y=re();
wr(Lcask(x,y)),putchar('\n');
}
if(s=="Stop")
flag=1;
}
return 0;
}