//Love and Freedom.
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define ll long long
#define inf 20021225
#define mdn 998244353
#define N 3000001
using namespace std;
int read()
{
	int s=0,f=1; char ch=getchar();
	while(ch<'0' || ch>'9')	{if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0' && ch<='9')	s=s*10+ch-'0',ch=getchar();
	return f*s;
}
int fac[N],inv[N];
void upd(int &x,int y){x+=x+y>=mdn?y-mdn:y;}
int ksm(int bs,int mi)
{
	int ans=1;
	while(mi)
	{
		if(mi&1)	ans=1ll*ans*bs%mdn;
		bs=1ll*bs*bs%mdn; mi>>=1;
	}
	return ans;
}
void init(int n)
{
	fac[0]=1;
	for(int i=1;i<=n;i++)	fac[i]=1ll*fac[i-1]*i%mdn;
	inv[n]=ksm(fac[n],mdn-2);
	for(int i=n;i;i--)		inv[i-1]=1ll*inv[i]*i%mdn;
}
int C(int n,int m)
{
	if(n<m)	return 0;
	return 1ll*fac[n]*inv[n-m]%mdn*inv[m]%mdn;
}
int F(int n,int m,int k)
{
	int top=min(n,k),ans=0;
	for(int i=0;i<=top;i++)	if(!((m-i)&1) && m>=i)
		upd(ans,1ll*C(n,i)*C(n-1+(m-i)/2,n-1)%mdn);
	return ans;
}
int main()
{
	int n=read(),m=read(); init(n+3*m);
	int ans=F(n,m*3,m)-1ll*(F(n,m,m)-F(n-1,m,m)+mdn)%mdn*n%mdn;
	printf("%d\n",(ans+mdn)%mdn);
	return 0;
}
### Prompt

Generate a CPP solution to 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
//Love and Freedom.
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define ll long long
#define inf 20021225
#define mdn 998244353
#define N 3000001
using namespace std;
int read()
{
	int s=0,f=1; char ch=getchar();
	while(ch<'0' || ch>'9')	{if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0' && ch<='9')	s=s*10+ch-'0',ch=getchar();
	return f*s;
}
int fac[N],inv[N];
void upd(int &x,int y){x+=x+y>=mdn?y-mdn:y;}
int ksm(int bs,int mi)
{
	int ans=1;
	while(mi)
	{
		if(mi&1)	ans=1ll*ans*bs%mdn;
		bs=1ll*bs*bs%mdn; mi>>=1;
	}
	return ans;
}
void init(int n)
{
	fac[0]=1;
	for(int i=1;i<=n;i++)	fac[i]=1ll*fac[i-1]*i%mdn;
	inv[n]=ksm(fac[n],mdn-2);
	for(int i=n;i;i--)		inv[i-1]=1ll*inv[i]*i%mdn;
}
int C(int n,int m)
{
	if(n<m)	return 0;
	return 1ll*fac[n]*inv[n-m]%mdn*inv[m]%mdn;
}
int F(int n,int m,int k)
{
	int top=min(n,k),ans=0;
	for(int i=0;i<=top;i++)	if(!((m-i)&1) && m>=i)
		upd(ans,1ll*C(n,i)*C(n-1+(m-i)/2,n-1)%mdn);
	return ans;
}
int main()
{
	int n=read(),m=read(); init(n+3*m);
	int ans=F(n,m*3,m)-1ll*(F(n,m,m)-F(n-1,m,m)+mdn)%mdn*n%mdn;
	printf("%d\n",(ans+mdn)%mdn);
	return 0;
}
```