ans=n!*A(n+1,2)*A(n+3,m)+n!*C(n+1,1)*2*m*A(n+2,m-1);
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m;
struct bign
{
long long a[10010];
int len;
};
bign nn,aa;
void init()
{
freopen("wiki.in","r",stdin);
//freopen("wiki.out","w",stdout);
}
void readdata()
{
scanf("%d%d",&n,&m);
}
void wocao()
{
long long a[10010];memset(a,0,sizeof(a));
a[1]=1;
int len=1;
for(int i=2;i<=n;i++)
{
long long c=0;
for(int j=1;j<=len;j++)
{
long long s=a[j]*i+c;
a[j]=s%100000;
c=s/100000;
}
while(c > 0)
{
len++;
a[len]=c%100000;
c/=100000;
}
}
memcpy(&nn.a,&a,sizeof(a));
nn.len=len;
memcpy(&aa.a,&a,sizeof(a));
aa.len=len;
}
void wogan(int u,int v)
{
long long a[10010],c;memset(a,0,sizeof(a));
a[1]=1;
int len=1;
for(int i=u;i>=u-v+1;i--)
{
c=0;
for(int j=1;j<=len;j++)
{
long long s=a[j]*i+c;
a[j]=s%100000;
c=s/100000;
}
while(c > 0)
{
len++;
a[len]=c%100000;
c/=100000;
}
}
//*********************************
long long b[10010],f[10010];
int lenb,lenf=0;
memset(f,0,sizeof(f));
for(int i=1;i<=nn.len;i++)
{
memset(b,0,sizeof(b));
long long x=nn.a[i],ss=0;int g=i;
for(int j=1;j<=len;j++)
{
long long y=a[j]*x+ss;
if(j==len)
{
b[g]=y%100000;
b[g+1]=y/100000;
if(y/100000!=0) lenb=g+1;
else lenb=g;
}
else
{
b[g++]=y%100000;
ss=y/100000;
}
}
lenf=max(lenf,lenb);
for(int i=1;i<=lenf;i++)
{
f[i]=f[i]+b[i];
}
int ee;
for(int i=1;i<=lenf;i++)
{
ee=f[i]/100000;
f[i]=f[i]%100000;
f[i+1]+=ee;
}
if(f[lenf+1]!=0) lenf++;
}
//*********************************
memcpy(&nn.a,&f,sizeof(f));
nn.len=lenf;
}
void wogan1(int u,int v)
{
long long a[10010],c;memset(a,0,sizeof(a));
a[1]=1;
int len=1;
for(int i=u;i>=u-v+1;i--)
{
c=0;
for(int j=1;j<=len;j++)
{
long long s=a[j]*i+c;
a[j]=s%100000;
c=s/100000;
}
while(c > 0)
{
len++;
a[len]=c%100000;
c/=100000;
}
}
long long b[10010],f[10010];
int lenb,lenf=0;
memset(f,0,sizeof(f));
for(int i=1;i<=aa.len;i++)
{
memset(b,0,sizeof(b));
long long x=aa.a[i],ss=0;int g=i;
for(int j=1;j<=len;j++)
{
long long y=a[j]*x+ss;
if(j==len)
{
b[g]=y%100000;
b[g+1]=y/100000;
if(y/100000!=0) lenb=g+1;
else lenb=g;
}
else
{
b[g++]=y%100000;
ss=y/100000;
}
}
lenf=max(lenf,lenb);
for(int i=1;i<=lenf;i++)
{
f[i]=f[i]+b[i];
}
int ee;
for(int i=1;i<=lenf;i++)
{
ee=f[i]/100000;
f[i]=f[i]%100000;
f[i+1]+=ee;
}
if(f[lenf+1]!=0) lenf++;
}
//*********************************
memcpy(&aa.a,&f,sizeof(f));
aa.len=lenf;
}
void wori()
{
nn.len=max(aa.len,nn.len);
for(int i=1;i<=nn.len;i++)
{
nn.a[i]=nn.a[i]+aa.a[i];
}
int ee;
for(int i=1;i<=nn.len;i++)
{
ee=nn.a[i]/100000;
nn.a[i]=nn.a[i]%100000;
nn.a[i+1]+=ee;
}
if(nn.a[nn.len+1]!=0) nn.len++;
}
void work()
{
wocao();
long long w=n*(n+1);
long long c=0;
for(int i=1;i<=nn.len;i++)
{
long long s=w*nn.a[i]+c;
nn.a[i]=s%100000;
c=s/100000;
}
while(c > 0)
{
nn.len++;
nn.a[nn.len]=c%100000;
c/=100000;
}
wogan(n+3,m);
long long y=2*(n+1)*m;
long long p=0;
for(int i=1;i<=aa.len;i++)
{
long long h=y*aa.a[i]+p;
aa.a[i]=h%100000;
p=h/100000;
}
while(p > 0)
{
aa.len++;
aa.a[aa.len]=p%100000;
p/=100000;
}
//*******************
wogan1(n+2,m-1);
wori();
for(int i=nn.len;i>=1;i--)
{
if(i==nn.len) printf("%d",nn.a[i]);
else printf("%05d",nn.a[i]);
}
printf("\n");
}
int main()
{
init();
readdata();
work();
return 0;
}