#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+15;
#define debug(n) cerr<<n<<endl;
#define pb push_back
vector<int>E[N];
int w[N],n,m;
int dep[N],siz[N],son[N],fa[N];
int faa[N][26];
void dfs1(int u,int f){
siz[u]=1;
for(auto v:E[u])if(v!=f){
dep[v]=dep[u]+1;
fa[v]=u;faa[v][0]=u;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v])
son[u]=v;
}
}
int rev[N],dfn[N],top[N],tot;
void dfs2(int u,int t){
top[u]=t;
rev[++tot]=u;
dfn[u]=tot;
if(!son[u]) return;
dfs2(son[u],t);
for(auto v:E[u]){
if(v!=fa[u] && v!=son[u])
dfs2(v,v);
}
}
void st(){
for(int i=1;i<=n;i++)
for(int j=1;j<=25;j++)
faa[i][j]=faa[faa[i][j-1]][j-1];
}
int mn[N<<2],lzy[N<<2];
void pushup(int k){mn[k]=min(mn[k<<1],mn[k<<1|1]);}
void pushdown(int k,int l,int r){
if(lzy[k]){
mn[k<<1]=mn[k<<1|1]=lzy[k<<1]=lzy[k<<1|1]=lzy[k];
lzy[k]=0;
}
}
void build(int k,int l,int r){
mn[k]=3e9;
if(l==r){
mn[k]=w[rev[l]];
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void update(int k,int l,int r,int x,int y,int del){
if(x<=l&&r<=y){
lzy[k]=del;
mn[k]=del;
return;
}
pushdown(k,l,r);
int mid=l+r>>1;
if(x<=mid)
update(k<<1,l,mid,x,y,del);
if(y>mid)
update(k<<1|1,mid+1,r,x,y,del);
pushup(k);
}
int query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)
return mn[k];
pushdown(k,l,r);
int ans=3e9;
int mid=l+r>>1;
if(x<=mid)
ans=min(ans,query(k<<1,l,mid,x,y));
if(y>mid)
ans=min(ans,query(k<<1|1,mid+1,r,x,y));
return ans;
}
void update(int u,int v,int del){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])
swap(u,v);
update(1,1,n,dfn[top[u]],dfn[u],del);
u=fa[top[u]];
}
if(dep[u]<dep[v])
swap(u,v);
update(1,1,n,dfn[v],dfn[u],del);
}
int query(int u,int v){
int ans=3e9;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])
swap(u,v);
ans=min(ans,query(1,1,n,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v])
swap(u,v);
ans=min(ans,query(1,1,n,dfn[v],dfn[u]));
return ans;
}
int LCA(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])
swap(u,v);
u=fa[top[u]];
}
if(dep[u]<dep[v])
swap(u,v);
return v;
}
int find(int rt,int u){
for(int j=25;j>=0;j--){
if(dep[faa[rt][j]]>dep[u])
rt=faa[rt][j];
}
return rt;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
E[u].pb(v);E[v].pb(u);
}
for(int i=1;i<=n;i++)
cin>>w[i];
dfs1(1,1);
dfs2(1,1);
build(1,1,n);
st();
int rt;cin>>rt;
while(m--){
int op;cin>>op;
if(op==1){
cin>>rt;
}
if(op==2){
int x,y,v;cin>>x>>y>>v;
update(x,y,v);
}
if(op==3){
int id;cin>>id;
if(id==rt){
cout<<query(1,1,n,1,n)<<'\n';continue;
}
int lca=LCA(rt,id);
if(lca==id){
int mn=3e9;
int v=find(rt,id);
mn=min(mn,query(1,1,n,1,dfn[v]-1));
if(dfn[v]+siz[v]-1!=n)mn=min(mn,query(1,1,n,dfn[v]+siz[v],n));
cout<<mn<<'\n';
}else{
cout<<query(1,1,n,dfn[id],dfn[id]+siz[id]-1)<<'\n';
}
}
}
}
祝dalao们RP++;