#include<bits/stdc++.h>
#define lid id<<1
#define rid id<<1|1
using namespace std;
int n;
const int N=1e5+5;
int h[N],ne[N<<1],to[N<<1],idx;
int cnt,son[N],siz[N],dep[N],top[N],fa[N],dfn[N];
int a[N],b[N],c[N];
struct tree{
int l,r,mx,lazy1,lazy2;
bool co;
}tr[N<<2];
void add(int a,int b){
to[++idx]=b;
ne[idx]=h[a];
h[a]=idx;
}
void dfs1(int x){
siz[x]=1,son[x]=-1;
for(int i=h[x];i!=-1;i=ne[i]){
int j=to[i];
if(j==fa[x]) continue;
dep[j]=dep[x]+1;
fa[j]=x;
dfs1(j);
siz[x]+=siz[j];
if(son[x]==-1||siz[j]>siz[son[x]]) son[x]=j;
}
}
void dfs2(int x,int tp){
top[x]=tp;
dfn[x]=++cnt;
if(son[x]==-1) return ;
dfs2(son[x],tp);
for(int i=h[x];i!=-1;i=ne[i]){
int j=to[i];
if(j!=son[x]&&j!=fa[x]) dfs2(j,j);
}
}
void pushdown(int id){
if(tr[id].l!=tr[id].r&&tr[id].co){
tr[lid].mx=tr[id].lazy1;
tr[rid].mx=tr[id].lazy1;
tr[lid].lazy1=tr[id].lazy1;
tr[rid].lazy1=tr[id].lazy1;
tr[lid].mx+=tr[id].lazy2;
tr[rid].mx+=tr[id].lazy2;
tr[lid].lazy2+=tr[id].lazy2;
tr[rid].lazy2+=tr[id].lazy2;
tr[id].co=false;
}
}
void build(int id,int l,int r){
tr[id].l=l,tr[id].r=r,tr[id].co=false,tr[id].mx=0;
if(l==r) return ;
int mid=(l+r)>>1;
build(lid,l,mid);
build(rid,mid+1,r);
}
void modify1(int id,int x,int v){
pushdown(id);
if(tr[id].l==tr[id].r){
tr[id].mx=v;
return;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(x<=mid) modify1(lid,x,v);
else modify1(rid,x,v);
tr[id].mx=max(tr[lid].mx,tr[rid].mx);
}
void modify2(int id,int l,int r,int v){
pushdown(id);
if(tr[id].l==l&&tr[id].r==r){
tr[id].mx=v;
tr[id].lazy2=0;
tr[id].lazy1=v;
tr[id].co=true;
return ;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid) modify2(lid,l,r,v);
else if(l>mid) modify2(rid,l,r,v);
else modify2(lid,l,mid,v),modify2(rid,mid+1,r,v);
tr[id].mx=max(tr[lid].mx,tr[rid].mx);
}
void modify3(int id,int l,int r,int v){
pushdown(id);
if(tr[id].l==l&&tr[id].r==r){
tr[id].mx+=v;
tr[id].lazy2+=v;
tr[id].co=true;
return ;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid) modify3(lid,l,r,v);
else if(l>mid) modify3(rid,l,r,v);
else modify3(lid,l,mid,v),modify3(rid,mid+1,r,v);
tr[id].mx=max(tr[lid].mx,tr[rid].mx);
}
int query(int id,int l,int r){
pushdown(id);
if(tr[id].l==l&&tr[id].r==r) return tr[id].mx;
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid) return query(lid,l,r);
else if(l>mid) return query(rid,l,r);
else return max(query(lid,l,mid),query(rid,mid+1,r));
}
int main(){
// freopen("P4315_1.in","r",stdin);
// freopen("P4315.out","w",stdout);
memset(h,-1,sizeof h);
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
add(a[i],b[i]),add(b[i],a[i]);
}
dfs1(1),dfs2(1,1);
build(1,1,n);
for(int i=1;i<n;i++){
if(dfn[a[i]]>dfn[b[i]]) modify1(1,dfn[a[i]],c[i]);
else modify1(1,dfn[b[i]],c[i]);
}
while(true){
string op;
int x,y,w;
cin>>op;
if(op=="Stop") break;
if(op=="Max"){
scanf("%d%d",&x,&y);
// printf("Max %d %d\n",x,y);
int ans=-0x3f3f3f3f;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,query(1,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dfn[x]>dfn[y]) swap(x,y);
if(dfn[x]!=dfn[y]) ans=max(ans,query(1,dfn[x]+1,dfn[y]));
printf("%d\n",ans);
}
else if(op=="Cover"){
scanf("%d%d%d",&x,&y,&w);
// printf("Cover %d %d %d\n",x,y,w);
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
modify2(1,dfn[top[x]],dfn[x],w);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(dfn[x]!=dfn[y]) modify2(1,dfn[x]+1,dfn[y],w);
}
else if(op=="Add"){
scanf("%d%d%d",&x,&y,&w);
// printf("Add %d %d %d\n",x,y,w);
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
modify3(1,dfn[top[x]],dfn[x],w);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(dfn[x]!=dfn[y]) modify3(1,dfn[x]+1,dfn[y],w);
}
else{
scanf("%d%d",&x,&w);
// printf("Change %d %d\n",x,w);
modify1(1,max(dfn[a[x]],dfn[b[x]]),w);
}
}
return 0;
}
24小时内到账。