#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define vpi basic_string<pii>
#define fi first
#define se second
using namespace std;
const int N=2e5+5;
struct SEG{
struct st{
int l,r;
ll c,s,z;
}a[N<<2];
void bt(int x,int l,int r){
a[x].l=l;
a[x].r=r;
a[x].c=a[x].s=a[x].z=0;
if(l<r){
bt(x<<1,l,(l+r>>1));
bt(x<<1|1,(l+r>>1)+1,r);
}
}
void ps(int x,ll v){
a[x].s+=(a[x].r-a[x].l+1)*v;
a[x].c+=v;
a[x].z+=v;
}
void xf(int x){
ps(x<<1,a[x].z);
ps(x<<1|1,a[x].z);
a[x].z=0;
}
void pu(int x){
a[x].c=max(a[x<<1].c,a[x<<1|1].c);
a[x].s=a[x<<1].s+a[x<<1|1].s;
}
void add(int x,int l,int r,ll v){
if(a[x].l==l&&a[x].r==r) return ps(x,v);
if(a[x].z) xf(x);
int mid=a[x].l+a[x].r>>1;
if(r<=mid) add(x<<1,l,r,v);
else if(l>mid) add(x<<1|1,l,r,v);
else add(x<<1,l,mid,v),add(x<<1|1,mid+1,r,v);
pu(x);
}
ll qs(int x,int l,int r){
if(a[x].l==l&&a[x].r==r) return a[x].s;
if(a[x].z) xf(x);
int mid=a[x].l+a[x].r>>1;
if(r<=mid) return qs(x<<1,l,r);
if(l>mid) return qs(x<<1|1,l,r);
return qs(x<<1,l,mid)+qs(x<<1|1,mid+1,r);
}
ll qv(int x,int l,int r){
if(a[x].l==l&&a[x].r==r) return a[x].c;
if(a[x].z) xf(x);
int mid=a[x].l+a[x].r>>1;
if(r<=mid) return qv(x<<1,l,r);
if(l>mid) return qv(x<<1|1,l,r);
return max(qv(x<<1,l,mid),qv(x<<1|1,mid+1,r));
}
}T;
int n,Q,K,fa[N],dfn[N],hs[N],siz[N],dcnt,dep[N],top[N];
vector<int>e[N],g[N];
vpi tk[N][4],lk[N][4],tr[N];
void dfs1(int x,int f){
siz[x]=1;
dep[x]=dep[f]+1;
fa[x]=f;
for(int i:e[x]){
if(i==f) continue;
dfs1(i,x);
siz[x]+=siz[i];
g[x].push_back(i);
}
for(int i:g[x]) if(siz[i]>siz[hs[x]]) hs[x]=i;
}
void lb(int x){
if(!dfn[x]) dfn[x]=++dcnt;
}
void dfs2(int x,int ff){
top[x]=ff;
if(ff==x){
vector<int>u;
for(int t=x;t;t=hs[t]) u.push_back(t),lb(t);
for(int i=1;i<=3;i++){
vector<int>v;
for(int j:u) for(int l:g[j]) if(top[j]!=x) v.push_back(l),lb(l);
u=v;
}
}
if(hs[x]) dfs2(hs[x],ff);
for(int i:g[x]) if(i!=hs[x]) dfs2(i,i);
}
void zp(vpi&x){
sort(x.begin(),x.end());
vpi y;
for(pii i:x){
if(y.empty()||i.fi>y.back().se+1) y.push_back(i);
else y.back().se=max(y.back().se,i.se);
}
x=y;
}
void add(vpi&x,const vpi&y){
if(y.empty()) return;
if(x.empty()) x=y;
else{
for(pii i:y) x.push_back(i);
zp(x);
}
}
void dfs3(int x){
tr[x]=tk[x][0]={{dfn[x],dfn[x]}};
for(int i:g[x]){
dfs3(i);
for(int j=0;j<K;j++) add(tk[x][j+1],tk[i][j]);
add(tr[x],tr[i]);
}
for(int i=0;i<K;i++) add(tk[x][i+1],tk[x][i]);
}
void dfs4(int x){
for(int i=0;i<=K;i++) lk[x][i]=tk[x][i];
if(x>1) for(int i=0;i<K;i++) add(tk[x][i+1],tk[fa[x]][i]);
if(top[x]!=x) for(int i=0;i<=K;i++) add(lk[x][i],lk[fa[x]][i]);
for(int i:g[x]) dfs4(i);
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
vpi del(vpi a,vpi b){
vpi res;
int l=0,r=-1,m=b.size();
for(pii i:a){
while(l<m&&b[l].se<i.fi) l++;
while(r<m-1&&b[r+1].fi<=i.se) r++;
if(l>r){
res.push_back(i);
continue;
}
if(i.fi<b[l].fi) res.push_back({i.fi,b[l].fi-1});
for(int j=l+1;j<=r;j++) res.push_back({b[j-1].se+1,b[j].fi-1});
if(i.se>b[r].se) res.push_back({b[r].se+1,i.se});
}
zp(res);
return res;
}
vpi qw(int x,int k){
if(!x) return {};
vpi res=lk[x][k];
add(res,qw(fa[top[x]],k));
return res;
}
vpi ql(int x,int y,int k){
int u=lca(x,y);
vpi res=tk[u][k];
vpi wx=qw(u,k);
add(res,del(qw(x,k),wx));
add(res,del(qw(y,k),wx));
return res;
}
int main(){
// freopen("T2/zyf8.in","r",stdin);
// freopen("T2/zyf8.out","w",stdout);
cin>>n>>Q;K=3;
for(int i=1,j,k;i<n;i++){
scanf("%d %d",&j,&k);
e[j].push_back(k);
e[k].push_back(j);
}
dfs1(1,0);
dfs2(1,1);
dfs3(1);
dfs4(1);
T.bt(1,1,n);
for(int op,x,y,k,u;Q--;){
vpi cw;
scanf("%d",&op);
if(op&1) scanf("%d %d %d",&x,&y,&k),cw=ql(x,y,k);
else scanf("%d",&x),cw=tr[x];
ll res=0;
if(op<3){
scanf("%d",&u);
for(pii i:cw) T.add(1,i.fi,i.se,u);
}
else if(op>4){
res=-1e15;
for(pii i:cw) res=max(res,T.qv(1,i.fi,i.se));
}
else for(pii i:cw) res+=T.qs(1,i.fi,i.se);
if(op>2) printf("%lld\n",res);
}
return 0;
}