#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353,N=1e7+5;
int ksm(int b,int n){
	int res=1;
	while(n){
		if(n&1) res=res*b%mod;
		b=b*b%mod; n>>=1;
	}
	return res;
}
int fac[N],inv[N];
void init(int n){
	fac[0]=1;
	for(int i=1;i<=n;++i)
		fac[i]=fac[i-1]*i%mod;
	inv[n]=ksm(fac[n],mod-2);
	for(int i=n-1;i>=0;--i)
		inv[i]=(i+1)*inv[i+1]%mod;
}
int C(int n,int m){
	if(n<m) return 0;
	return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
void add(int &x,int y){
	x=(x+y)%mod;
}
void dec(int &x,int y){
	x=(x+mod-y)%mod;
}
signed main(){
	int n,m,ans=0;
	cin>>n>>m;
	init(n+3*m);
	for(int i=0;i<=m;++i)
		if((3*m-i)%2==0) add(ans,C(n,i)*C((3*m-i)/2+n-1,n-1)%mod);
	for(int i=2*m+1;i<=3*m;++i)
		dec(ans,n*C(3*m-i+n-2,n-2)%mod);
	cout<<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<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353,N=1e7+5;
int ksm(int b,int n){
	int res=1;
	while(n){
		if(n&1) res=res*b%mod;
		b=b*b%mod; n>>=1;
	}
	return res;
}
int fac[N],inv[N];
void init(int n){
	fac[0]=1;
	for(int i=1;i<=n;++i)
		fac[i]=fac[i-1]*i%mod;
	inv[n]=ksm(fac[n],mod-2);
	for(int i=n-1;i>=0;--i)
		inv[i]=(i+1)*inv[i+1]%mod;
}
int C(int n,int m){
	if(n<m) return 0;
	return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
void add(int &x,int y){
	x=(x+y)%mod;
}
void dec(int &x,int y){
	x=(x+mod-y)%mod;
}
signed main(){
	int n,m,ans=0;
	cin>>n>>m;
	init(n+3*m);
	for(int i=0;i<=m;++i)
		if((3*m-i)%2==0) add(ans,C(n,i)*C((3*m-i)/2+n-1,n-1)%mod);
	for(int i=2*m+1;i<=3*m;++i)
		dec(ans,n*C(3*m-i+n-2,n-2)%mod);
	cout<<ans;
	return 0;
}
```