#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=998244353;
inline void add(int &x,int y){(x+=y)>=mod?x-=mod:0;}
inline int kpow(int a,int b)
{
	int s=1;
	for(;b;b>>=1,a=1ll*a*a%mod)
		if(b&1)s=1ll*s*a%mod;
	return s;
}
int n,m,ans,jc[2000010],jcv[2000010];
void init()
{
	jc[0]=1;
	for(int i=1;i<=2000000;++i)jc[i]=1ll*jc[i-1]*i%mod;
	jcv[2000000]=kpow(jc[2000000],mod-2);
	for(int i=2000000;i;--i)jcv[i-1]=1ll*jcv[i]*i%mod;
}
int C(int x,int y)
{
	if(x<y||y<0)return 0;
	return 1ll*jc[x]*jcv[y]%mod*jcv[x-y]%mod;
}
int calc(int a,int b,int s)
{
	int res=C(a+b+s-1,a+b-1);
	add(res,mod-1ll*b*C(a+b+s-2-m,a+b-1)%mod);
	add(res,mod-1ll*a*C(a+b+s-1-m,a+b-1)%mod);
	return res;
}
int main()
{
	scanf("%d %d",&n,&m);
	init();
	for(int i=m;i>=0;i-=2)add(ans,1ll*C(n,i)*calc(i,n-i,(3*m-i)/2)%mod)/*,printf("%d\n",ans)*/;
	printf("%d",ans);
	return 0;
}

### Prompt

Create a solution in CPP for the following problem:

We have a sequence of N integers: x=(x_0,x_1,\cdots,x_{N-1}). Initially, x_i=0 for each i (0 \leq i \leq N-1).

Snuke will perform the following operation exactly M times:

* Choose two distinct indices i, j (0 \leq i,j \leq N-1,\ i \neq j). Then, replace x_i with x_i+2 and x_j with x_j+1.



Find the number of different sequences that can result after M operations. Since it can be enormous, compute the count modulo 998244353.

Constraints

* 2 \leq N \leq 10^6
* 1 \leq M \leq 5 \times 10^5
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N M


Output

Print the number of different sequences that can result after M operations, modulo 998244353.

Examples

Input

2 2


Output

3


Input

3 2


Output

19


Input

10 10


Output

211428932


Input

100000 50000


Output

3463133

### Response

```cpp
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=998244353;
inline void add(int &x,int y){(x+=y)>=mod?x-=mod:0;}
inline int kpow(int a,int b)
{
	int s=1;
	for(;b;b>>=1,a=1ll*a*a%mod)
		if(b&1)s=1ll*s*a%mod;
	return s;
}
int n,m,ans,jc[2000010],jcv[2000010];
void init()
{
	jc[0]=1;
	for(int i=1;i<=2000000;++i)jc[i]=1ll*jc[i-1]*i%mod;
	jcv[2000000]=kpow(jc[2000000],mod-2);
	for(int i=2000000;i;--i)jcv[i-1]=1ll*jcv[i]*i%mod;
}
int C(int x,int y)
{
	if(x<y||y<0)return 0;
	return 1ll*jc[x]*jcv[y]%mod*jcv[x-y]%mod;
}
int calc(int a,int b,int s)
{
	int res=C(a+b+s-1,a+b-1);
	add(res,mod-1ll*b*C(a+b+s-2-m,a+b-1)%mod);
	add(res,mod-1ll*a*C(a+b+s-1-m,a+b-1)%mod);
	return res;
}
int main()
{
	scanf("%d %d",&n,&m);
	init();
	for(int i=m;i>=0;i-=2)add(ans,1ll*C(n,i)*calc(i,n-i,(3*m-i)/2)%mod)/*,printf("%d\n",ans)*/;
	printf("%d",ans);
	return 0;
}

```