#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define endl "\n"
#define task "gay tay cung to"
using namespace std;
ll n,q;
vector<ll>ke[200009];
ll heavy[200009],siz[200009],depth[200009],par[200009];
void dfs(ll u,ll prev)
{
depth[u]=depth[prev]+1;
par[u]=prev;
ll mxsiz=0;
siz[u]=1;
for(auto i:ke[u])
{
if(i!=prev)
{
dfs(i,u);
siz[u]+=siz[i];
if(mxsiz<siz[i])
{
mxsiz=siz[i];
heavy[u]=i;
}
}
}
}
ll head[200009],pos[200009],t=0,rg[200009];
void hld(ll u,ll prev)
{
head[u]=prev;
pos[u]=++t;
rg[u]=t;
if(heavy[u]!=0) hld(heavy[u],prev);
for(auto i:ke[u]) if(i!=heavy[u]&&i!=par[u]) hld(i,i);
for(auto i:ke[u]) if(i!=par[u]) rg[u]=max(rg[u],rg[i]);
}
ll segtree[800009],lazy[800009];
void passdown(ll id)
{
ll t=lazy[id];
segtree[id*2]+=t;
lazy[id*2]+=t;
segtree[id*2+1]+=t;
lazy[id*2+1]+=t;
lazy[id]=0;
}
void update(ll id,ll l,ll r,ll u,ll v,ll val)
{
if(l>v||r<u) return;
if(l>=u&&r<=v)
{
segtree[id]+=val;
lazy[id]+=val;
return;
}
passdown(id);
ll mid=(l+r)/2;
update(id*2,l,mid,u,v,val);
update(id*2+1,mid+1,r,u,v,val);
segtree[id]=max(segtree[id*2],segtree[id*2+1]);
}
ll get(ll id,ll l,ll r,ll u,ll v)
{
if(l>v||r<u) return 0;
if(l>=u&&r<=v) return segtree[id];
passdown(id);
ll mid=(l+r)/2;
return max(get(id*2,l,mid,u,v),get(id*2+1,mid+1,r,u,v));
}
void add(ll x,ll y,ll val)
{
while(head[x]!=head[y])
{
if(depth[head[x]]<depth[head[y]]) swap(x,y);
update(1,1,n,pos[head[x]],pos[x],val);
x=par[head[x]];
}
if(depth[x]<depth[y]) swap(x,y);
update(1,1,n,pos[y],pos[x],val);
}
ll query(ll x,ll y)
{
ll res=0;
while(head[x]!=head[y])
{
if(depth[head[x]]<depth[head[y]]) swap(x,y);
res=max(res,get(1,1,n,pos[head[x]],pos[x]));
x=par[head[x]];
}
if(depth[x]<depth[y]) swap(x,y);
res=max(res,get(1,1,n,pos[y],pos[x]));
return res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
if(fopen(task".inp","r"))
{
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin>>n>>q;
for(ll i=1;i<n;i++)
{
ll x,y;
cin>>x>>y;
ke[x].push_back(y);
ke[y].push_back(x);
}
dfs(1,0);
hld(1,1);
while(q--)
{
ll x,y,z,type;
cin>>type>>x;
if(type==4)
{
cout<<get(1,1,n,pos[x],rg[x])<<endl;
continue;
}
cin>>y;
if(type==1)
{
cin>>z;
add(x,y,z);
}
else if(type==2) update(1,1,n,pos[x],rg[x],y);
else if(type==3) cout<<query(x,y)<<endl;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIHRhc2sgImdheSB0YXkgY3VuZyB0byIKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKbGwgbixxOwp2ZWN0b3I8bGw+a2VbMjAwMDA5XTsKbGwgaGVhdnlbMjAwMDA5XSxzaXpbMjAwMDA5XSxkZXB0aFsyMDAwMDldLHBhclsyMDAwMDldOwp2b2lkIGRmcyhsbCB1LGxsIHByZXYpCnsKICAgIGRlcHRoW3VdPWRlcHRoW3ByZXZdKzE7CiAgICBwYXJbdV09cHJldjsKICAgIGxsIG14c2l6PTA7CiAgICBzaXpbdV09MTsKICAgIGZvcihhdXRvIGk6a2VbdV0pCiAgICB7CiAgICAgICAgaWYoaSE9cHJldikKICAgICAgICB7CiAgICAgICAgICAgIGRmcyhpLHUpOwogICAgICAgICAgICBzaXpbdV0rPXNpeltpXTsKICAgICAgICAgICAgaWYobXhzaXo8c2l6W2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteHNpej1zaXpbaV07CiAgICAgICAgICAgICAgICBoZWF2eVt1XT1pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmxsIGhlYWRbMjAwMDA5XSxwb3NbMjAwMDA5XSx0PTAscmdbMjAwMDA5XTsKdm9pZCBobGQobGwgdSxsbCBwcmV2KQp7CiAgICBoZWFkW3VdPXByZXY7CiAgICBwb3NbdV09Kyt0OwogICAgcmdbdV09dDsKICAgIGlmKGhlYXZ5W3VdIT0wKSBobGQoaGVhdnlbdV0scHJldik7CiAgICBmb3IoYXV0byBpOmtlW3VdKSBpZihpIT1oZWF2eVt1XSYmaSE9cGFyW3VdKSBobGQoaSxpKTsKICAgIGZvcihhdXRvIGk6a2VbdV0pIGlmKGkhPXBhclt1XSkgcmdbdV09bWF4KHJnW3VdLHJnW2ldKTsKfQoKbGwgc2VndHJlZVs4MDAwMDldLGxhenlbODAwMDA5XTsKdm9pZCBwYXNzZG93bihsbCBpZCkKewoJbGwgdD1sYXp5W2lkXTsKCXNlZ3RyZWVbaWQqMl0rPXQ7CglsYXp5W2lkKjJdKz10OwoJc2VndHJlZVtpZCoyKzFdKz10OwoJbGF6eVtpZCoyKzFdKz10OwoJbGF6eVtpZF09MDsKfQp2b2lkIHVwZGF0ZShsbCBpZCxsbCBsLGxsIHIsbGwgdSxsbCB2LGxsIHZhbCkKewoJaWYobD52fHxyPHUpIHJldHVybjsKCWlmKGw+PXUmJnI8PXYpCgl7CgkJc2VndHJlZVtpZF0rPXZhbDsKCQlsYXp5W2lkXSs9dmFsOwoJCXJldHVybjsKCX0KCXBhc3Nkb3duKGlkKTsKCWxsIG1pZD0obCtyKS8yOwoJdXBkYXRlKGlkKjIsbCxtaWQsdSx2LHZhbCk7Cgl1cGRhdGUoaWQqMisxLG1pZCsxLHIsdSx2LHZhbCk7CglzZWd0cmVlW2lkXT1tYXgoc2VndHJlZVtpZCoyXSxzZWd0cmVlW2lkKjIrMV0pOwp9CmxsIGdldChsbCBpZCxsbCBsLGxsIHIsbGwgdSxsbCB2KQp7CglpZihsPnZ8fHI8dSkgcmV0dXJuIDA7CglpZihsPj11JiZyPD12KSByZXR1cm4gc2VndHJlZVtpZF07CglwYXNzZG93bihpZCk7CglsbCBtaWQ9KGwrcikvMjsKCXJldHVybiBtYXgoZ2V0KGlkKjIsbCxtaWQsdSx2KSxnZXQoaWQqMisxLG1pZCsxLHIsdSx2KSk7Cn0KCnZvaWQgYWRkKGxsIHgsbGwgeSxsbCB2YWwpCnsKCXdoaWxlKGhlYWRbeF0hPWhlYWRbeV0pCgl7CgkJaWYoZGVwdGhbaGVhZFt4XV08ZGVwdGhbaGVhZFt5XV0pIHN3YXAoeCx5KTsKCQl1cGRhdGUoMSwxLG4scG9zW2hlYWRbeF1dLHBvc1t4XSx2YWwpOwoJCXg9cGFyW2hlYWRbeF1dOwoJfQoJaWYoZGVwdGhbeF08ZGVwdGhbeV0pIHN3YXAoeCx5KTsKCXVwZGF0ZSgxLDEsbixwb3NbeV0scG9zW3hdLHZhbCk7Cn0KbGwgcXVlcnkobGwgeCxsbCB5KQp7CglsbCByZXM9MDsKCXdoaWxlKGhlYWRbeF0hPWhlYWRbeV0pCgl7CgkJaWYoZGVwdGhbaGVhZFt4XV08ZGVwdGhbaGVhZFt5XV0pIHN3YXAoeCx5KTsKCQlyZXM9bWF4KHJlcyxnZXQoMSwxLG4scG9zW2hlYWRbeF1dLHBvc1t4XSkpOwoJCXg9cGFyW2hlYWRbeF1dOwoJfQoJaWYoZGVwdGhbeF08ZGVwdGhbeV0pIHN3YXAoeCx5KTsKCXJlcz1tYXgocmVzLGdldCgxLDEsbixwb3NbeV0scG9zW3hdKSk7CglyZXR1cm4gcmVzOwp9CmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgY291dC50aWUobnVsbHB0cik7CiAgICBpZihmb3Blbih0YXNrIi5pbnAiLCJyIikpCiAgICB7CiAgICAgICAgZnJlb3Blbih0YXNrIi5pbnAiLCJyIixzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQogICAgY2luPj5uPj5xOwogICAgZm9yKGxsIGk9MTtpPG47aSsrKQogICAgewogICAgCWxsIHgseTsKICAgIAljaW4+Png+Pnk7CiAgICAJa2VbeF0ucHVzaF9iYWNrKHkpOwogICAgCWtlW3ldLnB1c2hfYmFjayh4KTsKICAgIH0KICAgIGRmcygxLDApOwogICAgaGxkKDEsMSk7CiAgICB3aGlsZShxLS0pCiAgICB7CiAgICAJbGwgeCx5LHosdHlwZTsKICAgIAljaW4+PnR5cGU+Png7CiAgICAJaWYodHlwZT09NCkKICAgIAl7CiAgICAJCWNvdXQ8PGdldCgxLDEsbixwb3NbeF0scmdbeF0pPDxlbmRsOwogICAgCQljb250aW51ZTsKICAgIAl9CiAgICAJY2luPj55OwogICAgCWlmKHR5cGU9PTEpCiAgICAJewogICAgCQljaW4+Pno7CiAgICAJCWFkZCh4LHkseik7CiAgICAJfQogICAgCWVsc2UgaWYodHlwZT09MikgdXBkYXRlKDEsMSxuLHBvc1t4XSxyZ1t4XSx5KTsKICAgIAllbHNlIGlmKHR5cGU9PTMpIGNvdXQ8PHF1ZXJ5KHgseSk8PGVuZGw7CiAgICB9Cn0=