#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5+5;
ll n,m,rt,mod,w[N];
int dfn[N],tot,top[N],fa[N],son[N],dep[N],siz[N],rnk[N];
vector<int> g[N];
ll dat[N<<2],tag[N<<2];
void pu(int k){
dat[k]=(dat[k<<1]+dat[k<<1|1])%mod;
}
void pd(int k,ll l,ll r){
if (tag[k]){
ll mid=l+r>>1;
tag[k<<1]=(tag[k<<1]+tag[k])%mod;
tag[k<<1|1]=(tag[k<<1|1]+tag[k])%mod;
dat[k<<1]=(dat[k<<1]+(l-mid+1)*tag[k]%mod)%mod;
dat[k<<1|1]=(dat[k<<1|1]+(r-mid)*tag[k]%mod)%mod;
tag[k]=0;
}
}
void bd(int k,int l,int r){
tag[k]=0;
if (l==r){
dat[k]=w[rnk[l]]%mod;
return;
}
int mid=l+r>>1;
bd(k<<1,l,mid);
bd(k<<1|1,mid+1,r);
pu(k);
}
void upd(int k,int l,int r,int ql,int qr,ll ad){
if (l>qr || r<ql){
return;
}
if (ql<=l && r<=qr){
tag[k]=(tag[k]+ad)%mod;
dat[k]=(dat[k]+ad*(r-l+1)%mod)%mod;
return;
}
pd(k,l,r);
int mid=l+r>>1;
upd(k<<1,l,mid,ql,qr,ad);
upd(k<<1|1,mid+1,r,ql,qr,ad);
pu(k);
}
ll qy(int k,int l,int r,int ql,int qr){
if (l>qr || r<ql){
return 0;
}
if (ql<=l && r<=qr){
return dat[k];
}
pd(k,l,r);
int mid=l+r>>1;
ll vl=qy(k<<1,l,mid,ql,qr);
ll vr=qy(k<<1|1,mid+1,r,ql,qr);
return (vl+vr)%mod;
}
void dfs1(int u,int fz){
ll mx=0;
siz[u]=1;
fa[u]=fz;
dep[u]=dep[fz]+1;
for (auto v : g[u]){
if (v!=fz){
dfs1(v,u);
siz[u]+=siz[v];
if (siz[v]>mx){
mx=siz[v];
son[u]=v;
}
}
}
}
void dfs2(int u,int tp){
top[u]=tp;
dfn[u]=++tot;
rnk[tot]=u;
if (!son[u]){
return;
}
dfs2(son[u],tp);
for (auto v : g[u]){
if (v!=fa[u] && v!=son[u]){
dfs2(v,v);
}
}
}
void upd_sub(int x,ll z){
upd(1,1,n,dfn[x],dfn[x]+siz[x]-1,z);
}
void qy_sub(int x){
cout<<qy(1,1,n,dfn[x],dfn[x]+siz[x]-1)<<"\n";
}
void upd_chain(int x,int y,ll z){
while (top[x]!=top[y]){
if (dep[top[x]]<dep[top[y]]){
swap(x,y);
}
upd(1,1,n,dfn[top[x]],dfn[x],z);
x=fa[top[x]];
}
if (dep[x]>dep[y]){
swap(x,y);
}
upd(1,1,n,dfn[x],dfn[y],z);
}
void qy_chain(int x,int y){
ll ans=0;
while (top[x]!=top[y]){
if (dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans+=qy(1,1,n,dfn[top[x]],dfn[x]);
ans%=mod;
x=fa[top[x]];
}
if (dep[x]>dep[y]){
swap(x,y);
}
ans+=qy(1,1,n,dfn[x],dfn[y]);
ans%=mod;
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m>>rt>>mod;
for (int i=1; i<=n; i++){
cin>>w[i];
}
for (int i=1; i<n; i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs1(rt,0);
dfs2(rt,rt);
bd(1,1,n);
while (m--){
int op;
cin>>op;
if (op==1){
ll x,y,z;
cin>>x>>y>>z;
upd_chain(x,y,z);
}
else if (op==2){
int x,y;
cin>>x>>y;
qy_chain(x,y);
}
else if (op==3){
ll x,z;
cin>>x>>z;
upd_sub(x,z);
}
else{
ll x;
cin>>x;
qy_sub(x);
}
}
return 0;
}