#include<bits/stdc++.h>
#define N 200005
#define int long long
#define mid (l+r>>1)
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
struct edge{int to,nxt,cost;}e[N];
struct tree{int ls,rs,sum,maxn;}tr[N*50];
int ecnt=-1,head[N],dep[N],siz[N],fa[N],hson[N],top[N],dfn[N],pos[N],cnt;
int n,m,lz[4*N],w[N],c[N],qcnt,tot,r[N];
void insert(int x,int y,int z){e[++ecnt]=(edge){y,head[x],z};head[x]=ecnt;}
void dfs1(int now,int fa_now){
fa[now]=fa_now;siz[now]=1;dep[now]=dep[fa_now]+1;hson[now]=-1;
for(int i=head[now];~i;i=e[i].nxt){
int to=e[i].to;
if(to==fa_now)continue;
dfs1(to,now);siz[now]+=siz[to];
if(hson[now]=-1||siz[to]>siz[hson[now]])hson[now]=to;
}
}
void dfs2(int now,int top_now){
top[now]=top_now;dfn[now]=++cnt;pos[cnt]=now;
if(hson[now]==-1)return;
dfs2(hson[now],top_now);
for(int i=head[now];~i;i=e[i].nxt)if(e[i].to!=hson[now]&&e[i].to!=fa[now])dfs2(e[i].to,e[i].to);
}
int New(){tr[++tot].ls=tr[tot].rs=tr[tot].sum=tr[tot].maxn=0;return tot;}
void modify(int &p,int l,int r,int pos,int x){
if(!p)p=New();
if(l==r){tr[p].sum=tr[p].maxn+=x;return;}
if(pos<=mid)modify(tr[p].ls,l,mid,pos,x);
else modify(tr[p].rs,mid+1,r,pos,x);
tr[p].sum=tr[tr[p].ls].sum+tr[tr[p].rs].sum;
tr[p].maxn=max(tr[tr[p].ls].maxn,tr[tr[p].rs].maxn);
}
int query(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql||!p)return 0;
if(l>=ql&&r<=qr)return tr[p].sum;
return query(tr[p].ls,l,mid,ql,qr)+query(tr[p].rs,mid+1,r,ql,qr);
}
int max_query(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql||!p)return 0;
if(l>=ql&&r<=qr)return tr[p].maxn;
return max(max_query(tr[p].ls,l,mid,ql,qr),max_query(tr[p].rs,mid+1,r,ql,qr));
}
int summary_chain(int x,int y,int now_c){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=query(r[now_c],1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans+=query(r[now_c],1,n,dfn[x],dfn[y]);
return ans;
}
int max_chain(int x,int y,int now_c){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,max_query(r[now_c],1,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans=max(ans,max_query(r[now_c],1,n,dfn[top[x]],dfn[x]));
return ans;
}
signed main(){
memset(head,-1,sizeof(head));
n=read(),m=read();
for(int i=1;i<=n;i++)w[i]=read(),c[i]=read();
for(int i=1;i<=n-1;i++){int x=read(),y=read();insert(x,y,0);insert(y,x,0);}
dfs1(1,0);dfs2(1,1);
for(int i=1;i<=n;i++)modify(r[c[i]],1,n,dfn[i],w[i]);
for(int i=1;i<=m;i++){
string s;cin>>s;int x=read(),y=read();
if(s[1]=='C'){modify(r[c[x]],1,n,dfn[x],-w[x]);c[x]=y;modify(r[c[x]],1,n,pos[x],w[x]);}
if(s[1]=='W'){modify(r[c[x]],1,n,dfn[x],y-w[x]);w[x]=y;}
if(s[1]=='S')printf("%lld\n",summary_chain(x,y,c[x]));
if(s[1]=='M')printf("%lld\n",max_chain(x,y,c[x]));
}
return 0;
}