#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

typedef long long LL;

const int maxn=1e6+5;
const LL mo=998244353;

int n,m;

LL mi(LL x,LL y)
{
	LL re=1;
	for(; y; y>>=1, x=x*x%mo) if (y&1) re=re*x%mo;
	return re;
}

LL fac[4*maxn],ny[4*maxn];
void Pre(int n)
{
	fac[0]=1;
	fo(i,1,n) fac[i]=fac[i-1]*i%mo;
	ny[n]=mi(fac[n],mo-2);
	fd(i,n-1,0) ny[i]=ny[i+1]*(i+1)%mo;
}
LL C(int n,int m) {return (n<m) ?0 :fac[n]*ny[m]%mo*ny[n-m]%mo;}

LL calc(int n,int sum,int m)
{
	LL re=0;
	fo(i,0,m) if (!((sum-i)&1)) (re+=C(n,i)*C((sum-i)/2+n-1,n-1))%=mo;
	return re;
}

int main()
{
	scanf("%d %d",&n,&m);
	
	Pre(3*m+n);
	
	LL ans=calc(n,3*m,m)-(calc(n,m,m)-calc(n-1,m,m))%mo*n;
	
	printf("%lld\n",(ans%mo+mo)%mo);
}
### Prompt

In Cpp, your task is to solve 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<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

typedef long long LL;

const int maxn=1e6+5;
const LL mo=998244353;

int n,m;

LL mi(LL x,LL y)
{
	LL re=1;
	for(; y; y>>=1, x=x*x%mo) if (y&1) re=re*x%mo;
	return re;
}

LL fac[4*maxn],ny[4*maxn];
void Pre(int n)
{
	fac[0]=1;
	fo(i,1,n) fac[i]=fac[i-1]*i%mo;
	ny[n]=mi(fac[n],mo-2);
	fd(i,n-1,0) ny[i]=ny[i+1]*(i+1)%mo;
}
LL C(int n,int m) {return (n<m) ?0 :fac[n]*ny[m]%mo*ny[n-m]%mo;}

LL calc(int n,int sum,int m)
{
	LL re=0;
	fo(i,0,m) if (!((sum-i)&1)) (re+=C(n,i)*C((sum-i)/2+n-1,n-1))%=mo;
	return re;
}

int main()
{
	scanf("%d %d",&n,&m);
	
	Pre(3*m+n);
	
	LL ans=calc(n,3*m,m)-(calc(n,m,m)-calc(n-1,m,m))%mo*n;
	
	printf("%lld\n",(ans%mo+mo)%mo);
}
```