#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e4+10;
int n,a,b,q,w[N],dfn[N],tot,fa[N],tp[N],son[N],sz[N],t[N<<2],t1[N<<2],dep[N];vector<int>G[N];
void dfs1(int u){
sz[u]=1;for(int v:G[u])if(v^fa[u])
fa[v]=u,dep[v]=dep[u]+1,dfs1(v),sz[v]+=sz[u],sz[son[u]]<sz[v]&&(son[u]=v);
}
void dfs2(int u,int x){
dfn[u]=++tot;
tp[u]=x; if(!son[u]) return;
dfs2(son[u],x); for(int v:G[u])if(v!=fa[u]&&v!=son[u])dfs2(v,v);
}
#define tr int h,int l,int r
#define mid (l+r>>1)
#define ls h*2
#define rs ls|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define pushup(h) t[h]=t[ls]+t[rs],t1[h]=max(t1[ls],t1[rs])
void build(tr){
if(l==r) t[h]=w[l],t1[h]=w[l];
else build(lson),build(rson),pushup(h);
}
void modify(tr,int x,int y){
if(l==r) t[h]=y,t1[h]=y;
else {
if(x<=mid) modify(lson,x,y);
else modify(rson,x,y);
pushup(h);
}
}
int query(tr,int x,int y,bool z){
if(x<=l&&r<=y) return z?t[h]:t1[h];
if(y<=mid) return query(lson,x,y,z);
if(x>mid) return query(rson,x,y,z);
if(z) return query(lson,x,y,z)+query(rson,x,y,z);
return max(query(lson,x,y,z),query(rson,x,y,z));
}
int qchain(int u,int v,bool z){
int ans=0;
for(;tp[u]!=tp[v];u=fa[tp[u]]){
if(dep[tp[u]]<dep[tp[v]]) swap(u,v);
if(z) ans+=query(1,1,n,dfn[tp[u]],dfn[u],z);
else ans=max(ans,query(1,1,n,dfn[tp[u]],dfn[u],z));
}
if(dep[u]<dep[v]) swap(u,v);
if(z) ans+=query(1,1,n,dfn[v],dfn[u],z);
else ans=max(ans,query(1,1,n,dfn[v],dfn[u],z));
return ans;
}
main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n;
for(int i=1,u,v;i<n;++i) cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
for(int i=1;i<=n;++i) cin>>w[i];
dfs1(1),dfs2(1,1),build(1,1,n);
cin>>q;while(q--){string s;int u,v;cin>>s>>u>>v;if(s[0]=='C')modify(1,1,n,u,v);else if(s[1]=='M')cout<<qchain(u,v,0)<<'\n';else cout<<qchain(u,v,1)<<'\n';}
}