#include<iostream>
#include<vector>
#define mid (l+r>>1)
#define L (p<<1)
#define R (p<<1|1)
#define N 100005
using namespace std;
vector<int> r[N];
int n,sfn,id[N],dep[N],siz[N],son[N],fa[N],top[N],W[N],aa[N],bb[N];
struct tree{int l,r,ad,fx,w,mx;}tr[N<<2];
inline void build(int p,int l,int r){
tr[p]={l,r,0,-1,-1,0};
if(l==r)return;
build(L,l,mid);
build(R,mid+1,r);
}inline void upad(int p,int ad){tr[p].ad+=ad;tr[p].mx+=ad;tr[p].w=0;}
inline void upfx(int p,int fx){tr[p].fx=fx;tr[p].mx=fx;tr[p].w=1;}
inline void pushdown(int p){
if(tr[p].w!=-1){
if(tr[p].w)upfx(L,tr[p].fx),upfx(R,tr[p].fx),tr[p].fx=-1,tr[p].ad=0;
else{
if(tr[p].fx!=-1)upfx(L,tr[p].fx),upfx(R,tr[p].fx),tr[p].fx=-1;
upad(L,tr[p].ad);upad(R,tr[p].ad);tr[p].ad=0;
}tr[p].w=-1;
}
}inline void add(int p,int l,int r,int w){
if(tr[p].l>r||tr[p].r<l)return;
if(tr[p].l>=l&&tr[p].r<=r)return upad(p,w);
pushdown(p);add(L,l,r,w);add(R,l,r,w);
tr[p].mx=max(tr[L].mx,tr[R].mx);
}inline void fix(int p,int l,int r,int w){
if(tr[p].l>r||tr[p].r<l)return;
if(tr[p].l>=l&&tr[p].r<=r)return upfx(p,w);
pushdown(p);fix(L,l,r,w);fix(R,l,r,w);
tr[p].mx=max(tr[L].mx,tr[R].mx);
}inline int query(int p,int l,int r){
if(tr[p].l>r||tr[p].r<l)return 0;
if(tr[p].l>=l&&tr[p].r<=r)return tr[p].mx;
pushdown(p);return max(query(L,l,r),query(R,l,r));
}inline void addt(int u,int v,int w){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])u^=v,v^=u,u^=v;
add(1,id[top[u]],id[u],w);
u=fa[top[u]];
}if(dep[u]>dep[v])u^=v,v^=u,u^=v;
if(u==v)return;
add(1,id[son[u]],id[v],w);
}inline void fixt(int u,int v,int w){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])u^=v,v^=u,u^=v;
fix(1,id[top[u]],id[u],w);
u=fa[top[u]];
}if(dep[u]>dep[v])u^=v,v^=u,u^=v;
if(u==v)return;
fix(1,id[son[u]],id[v],w);
}inline int queryt(int u,int v){
int res=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])u^=v,v^=u,u^=v;
res=max(res,query(1,id[top[u]],id[u]));
u=fa[top[u]];
}if(dep[u]>dep[v])u^=v,v^=u,u^=v;
if(u==v)return res;
return max(res,query(1,id[son[u]],id[v]));
}inline void dfs1(int u,int faa){
fa[u]=faa;dep[u]=dep[faa]+1;siz[u]=1;
for(auto v:r[u])if(v!=faa){
dfs1(v,u);siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
}inline void dfs2(int u,int tp){
top[u]=tp;id[u]=++sfn;
if(!son[u])return;
dfs2(son[u],tp);
for(auto v:r[u])if(v!=fa[u]&&v!=son[u])dfs2(v,v);
}int main(){
scanf("%d",&n);
for(int i=1,u,v;i<n;i++){
scanf("%d%d%d",&u,&v,&W[i]);
r[u].emplace_back(v);r[v].emplace_back(u);
aa[i]=u;bb[i]=v;
}dfs1(1,1);dfs2(1,1);build(1,1,n);
for(int i=1;i<n;i++)dep[aa[i]]>dep[bb[i]]?aa[i]=aa[i]:aa[i]=bb[i],fix(1,id[aa[i]],id[aa[i]],W[i]);
char op[77];int u,v,w;scanf("%s",op);
while(op[0]!='S'){
if(op[0]=='M')scanf("%d%d",&u,&v),printf("%d\n",queryt(u,v));
else if(op[0]=='A')scanf("%d%d%d",&u,&v,&w),addt(u,v,w);
else if(op[1]=='h')scanf("%d%d",&u,&v),fix(1,id[aa[u]],id[aa[u]],v);
else scanf("%d%d%d",&u,&v,&w),fixt(u,v,w);
scanf("%s",op);
}return 0;
}