rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
struct edge{
int val,fa,son[2],res,size,cnt,lazy_mul,lazy_add;bool mark;
}a[2000005];
const int mod=51061;
#define lson(x) (a[x].son[0])
#define rson(x) (a[x].son[1])
#define fa(x) (a[x].fa)
#define check_son(x,f) (rson(f)==x)
#define connect(x,y,s) a[fa(x)=y].son[s]=x
#define push_up(x) a[x].res=(a[lson(x)].res+a[rson(x)].res+a[x].val)%mod,a[x].size=a[lson(x)].size+a[rson(x)].size+a[x].cnt
#define ntroot(x) (lson(fa(x))==x||rson(fa(x))==x)
#define reverse(x) swap(lson(x),rson(x)),a[x].mark^=1;
void push_down_add(int now)
{
if(a[now].son[0])
{
a[a[now].son[0]].res+=a[now].lazy_add*a[a[now].son[0]].size,
a[a[now].son[0]].val+=a[now].lazy_add*a[a[now].son[0]].size,
a[a[now].son[0]].lazy_add+=a[now].lazy_add,
a[a[now].son[0]].val%=mod;
a[a[now].son[0]].lazy_add%=mod;
a[a[now].son[0]].res%=mod;
}
if(a[now].son[1])
{
a[a[now].son[1]].res+=a[now].lazy_add*a[a[now].son[1]].size,
a[a[now].son[1]].val+=a[now].lazy_add*a[a[now].son[1]].size,
a[a[now].son[1]].lazy_add+=a[now].lazy_add,
a[a[now].son[1]].val%=mod;
a[a[now].son[1]].lazy_add%=mod;
a[a[now].son[1]].res%=mod;
}
a[now].lazy_add=0;
}
void push_down_mul(int now)
{
if(a[now].son[0])
{
a[a[now].son[0]].res*=a[now].lazy_mul,
a[a[now].son[0]].val*=a[now].lazy_mul,
a[a[now].son[0]].lazy_mul*=a[now].lazy_mul,
a[a[now].son[0]].lazy_add*=a[a[now].son[0]].lazy_mul,
a[a[now].son[0]].lazy_mul%=mod;
a[a[now].son[0]].val%=mod;
a[a[now].son[0]].lazy_add%=mod;
a[a[now].son[0]].res%=mod;
}
if(a[now].son[1])
{
a[a[now].son[1]].res*=a[now].lazy_mul,
a[a[now].son[1]].val*=a[now].lazy_mul,
a[a[now].son[1]].lazy_mul*=a[now].lazy_mul,
a[a[now].son[1]].lazy_add*=a[a[now].son[1]].lazy_mul,
a[a[now].son[1]].lazy_mul%=mod;
a[a[now].son[1]].val%=mod;
a[a[now].son[1]].lazy_add%=mod;
a[a[now].son[1]].res%=mod;
}
a[now].lazy_mul=1;
}
void push_down(int x)
{
if(a[x].lazy_mul!=1) push_down_mul(x);
if(a[x].lazy_add!=0) push_down_add(x);
if(a[x].mark)
{
if(lson(x)) reverse(lson(x));
if(rson(x)) reverse(rson(x));
a[x].mark=0;
}
}
void push_all(int x)
{
if(ntroot(x)) push_all(fa(x));
push_down(x);
}
void rotate(int x)
{
int y=fa(x),z=fa(y),tmp=check_son(x,y);
connect(a[x].son[tmp^1],y,tmp);
fa(x)=z;
if(ntroot(y)) a[z].son[check_son(y,z)]=x;
connect(y,x,tmp^1);
push_up(y);push_up(x);
}
void splay(int x,int goal)
{
push_all(x);
while(ntroot(x))
{
int y=fa(x),z=fa(y);
if(ntroot(y)) check_son(y,z)^check_son(x,y)?rotate(x):rotate(y);
rotate(x);
}push_up(x);
}
void access(int x)
{
int tmp=0;
while(x)
{
splay(x,0);
rson(x)=tmp;
push_up(x);
tmp=x,x=fa(x);
}
}
void mkroot(int x)
{
access(x);
splay(x,0);
reverse(x);
}
int findroot(int x)
{
access(x);
splay(x,0);
while(lson(x))
{
push_down(x);
x=lson(x);
}
// splay(x,0);
return x;
}
void link(int x,int y)
{
mkroot(x);
// if(findroot(y)==x) return;
fa(x)=y;
}
void cut(int x,int y)
{
mkroot(x);
// if(findroot(y)!=x||fa(y)!=x||lson(y)) return;
fa(y)=rson(x)=0;
push_up(x);
}
void split(int x,int y)
{
mkroot(x);
access(y);
splay(y,0);
}
signed main()
{
// freopen("a.in","r",stdin);
scanf("%lld%lld",&n,&q);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);link(x,y);a[i].cnt=a[i].size=1;a[i].val=1,a[i].lazy_mul=1;
}
a[n].cnt=a[n].size=1;a[n].val=1,a[n].lazy_mul=1;
char op[10];
while(q--)
{
scanf("%s",op);int x,y,val;
if(op[0]=='+')
{
scanf("%lld%lld%lld",&x,&y,&val);
split(x,y);
a[y].res+=a[y].size*val,a[y].lazy_add+=val,a[y].val+=val;
a[y].val%=mod;a[y].lazy_add%=mod;a[y].res%=mod;
}
else if(op[0]=='-')
{
scanf("%lld%lld",&x,&y);cut(x,y);
scanf("%lld%lld",&x,&y);link(x,y);
}
else if(op[0]=='*')
{
scanf("%lld%lld%lld",&x,&y,&val);
split(x,y);
a[y].res*=val,a[y].lazy_mul*=val,a[y].val*=val;
a[y].val%=mod;a[y].lazy_mul%=mod;a[y].res%=mod;
}
else if(op[0]=='/')
{
scanf("%lld%lld",&x,&y);
split(x,y);
printf("%lld\n",a[y].res);
}
}
}