#include<bits/stdc++.h>
using namespace std;
#define D cout<<__LINE__<<" "<<__FUNCTION__<<endl;
#define D
const int inf=0x3f3f3f3f;
const int N=1e5+10;
int n;
struct edge
{
int to,nxt,w;
edge()
{
to=0;
nxt=0;
w=0;
}
} e[N*2];
int tot,head[N*2];
int val[N],va[N];
inline int read()
{
int f=1,x=0;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c))
{
x=x*10+(c^48);
c=getchar();
}
return x*f;
}
inline void add(int a,int b,int w)
{
e[++tot].to=b;
e[tot].w=w;
e[tot].nxt=head[a];
head[a]=tot;
}
namespace seg
{
int cov[N*4];
int mx[N*4];
int ad[N*4];
#define ls (rt*2)
#define rs (rt*2+1)
#define mid ((l+r)>>1)
inline void mat(int rt)
{
mx[rt]=max(mx[ls],mx[rs]);
}
inline void psh(int rt,int l,int r)
{
if(cov[rt]!=-1)
{
cov[ls]=cov[rt];
cov[rs]=cov[rt];
ad[ls]=0;
ad[rs]=0;
mx[ls]=cov[rt];
mx[rs]=cov[rt];
cov[rt]=-1;
}
ad[ls]+=ad[rt];
ad[rs]+=ad[rt];
cov[ls]+=ad[rt];
cov[rs]+=ad[rt];
ad[rt]=0;
}
inline void build(int l,int r,int rt)
{
cov[rt]=-1;
ad[rt]=0;
if(l==r)
{
mx[rt]=val[l];
return ;
}
build(l,mid,ls);
build(mid+1,r,rs);
mat(rt);
}
inline void change(int l,int r,int L,int R,int rt,int v)
{
if(L<=l&&r<=R)
{
ad[rt]=0;
mx[rt]=v;
cov[rt]=v;
return ;
}
psh(rt,l,r);
if(L<=mid)change(l,mid,L,R,ls,v);
if(mid<R)change(mid+1,r,L,R,rs,v);
mat(rt);
}
inline void add(int l,int r,int L,int R,int rt,int v)
{
if(L<=l&&r<=R)
{
ad[rt]+=v;
mx[rt]+=v;
return ;
}
psh(rt,l,r);
if(L<=mid)add(l,mid,L,R,ls,v);
if(mid<R)add(mid+1,r,L,R,rs,v);
mat(rt);
}
inline int query(int l,int r,int L,int R,int rt)
{
if(L<=l&&r<=R)
{
return mx[rt];
}
int res=-inf;
psh(rt,l,r);
if(L<=mid)res=max(res, query(l,mid,L,R,ls) );
if(mid<R)res=max(res, query(mid+1,r,L,R,rs) );
return res;
}
}
namespace decom
{
int fa[N],dep[N],dfn[N],top[N],siz[N],son[N];
int cnt=0;
inline void dfs1(int rt,int father)
{
fa[rt]=father;
son[rt]=-1;
siz[rt]=1;
for(int i=head[rt]; i; i=e[i].nxt)
{
int to=e[i].to;
if(to==father)continue;
va[to]=e[i].w;
dep[to]=dep[rt]+1;
dfs1(to,rt);
siz[rt]+=siz[to];
if(son[rt]==-1||siz[son[rt]]<siz[to])son[rt]=to;
}
}
inline void dfs2(int rt,int tp)
{
dfn[rt]=++cnt;
top[rt]=tp;
val[cnt]=va[rt];
if(son[rt]==-1)return ;
dfs2(son[rt],tp);
for(int i=head[rt]; i; i=e[i].nxt)
{
int to=e[i].to;
if(to==son[rt]||to==fa[rt])continue;
dfs2(to,to);
}
}
inline void change(int a,int b,int v)
{
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
seg::change(1,n,dfn[top[a]],dfn[a],1,v);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
seg::change(1,n,dfn[a]+1,dfn[b],1,v);
return ;
}
inline void add(int a,int b,int v)
{
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
seg::add(1,n,dfn[top[a]],dfn[a],1,v);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
seg::add(1,n,dfn[a]+1,dfn[b],1,v);
return ;
}
inline int query(int a,int b)
{
int res=-inf;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
res=max(res,seg::query(1,n,dfn[top[a]],dfn[a],1) );
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
res=max(res,seg::query(1,n,dfn[a]+1,dfn[b],1) );
return res;
}
}
pair<int,int> id[N];
int main()
{
freopen("P4315_1.in","r",stdin);
freopen("ans.out","w",stdout);
n=read();
for(int i=1; i<n; i++)
{
int u=read(),v=read(),w=read();
id[i].first=u;
id[i].second=v;
add(u,v,w);
add(v,u,w);
}
decom::dfs1(1,0);
D
decom::dfs2(1,1);
D
seg::build(1,n,1);
D
string s;
while(1)
{
cin>>s;
if(s=="Stop") break;
else
{
if(s=="Max")
{
int a=read(),b=read();
cout<<decom::query(a,b)<<endl;
}
else if(s=="Cover")
{
int u=read(),v=read(),w=read();
decom::change(u,v,w);
}
else if(s=="Add")
{
int u=read(),v=read(),w=read();
decom::add(u,v,w);
}
else if(s=="Change")
{
int k=read(),w=read();
decom::change(id[k].first,id[k].second,w);
}
}
}
return 0;
}