#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rrep(i,a,b) for(int i=(a);i>=(b);--i)
#define MP make_pair
#define PB push_back
typedef long long LL;
const LL MOD = 998244353;
const int N = 2.5e6+10;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n,m;
LL fac[N],ifac[N];

LL pw(LL x,int n){
	LL res = 1;
	for(;n;n>>=1,x=x*x%MOD)if(n&1)res=res*x%MOD;
	return res;
}

LL C(int n,int x){
	return fac[n] * ifac[x] % MOD * ifac[n-x] % MOD;
}

int main(){
	//freopen("test.in","r",stdin);
	cin>>n>>m;
	fac[0] = 1;
	rep(i,1,N-1)fac[i]=fac[i-1]*i%MOD;
	ifac[N-1] = pw(fac[N-1],MOD-2);
	rrep(i,N-2,0)ifac[i]=ifac[i+1]*(i+1)%MOD;
	//cout<<fac[1]*ifac[1]%MOD<<" "<<fac[2]*ifac[2]%MOD<<" "<<fac[3]*ifac[3]%MOD<<endl;
	int s = 3*m;
	LL num = C(s+n-1,n-1);
	LL sub1 = n * C(n+m-2, n-1) % MOD, sub2 = 0;
	for(int i=m+2;i<=min(3*m,n);i+=2){
		int s1 = (s-i)/2;
		sub2 = (sub2 + C(n, i) * C(s1+n-1, n-1)) % MOD;
	}
	cout<<(num - sub1 - sub2 + MOD * 2) % MOD<<endl;
	return 0;
}
### Prompt

Your challenge is to write 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
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rrep(i,a,b) for(int i=(a);i>=(b);--i)
#define MP make_pair
#define PB push_back
typedef long long LL;
const LL MOD = 998244353;
const int N = 2.5e6+10;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n,m;
LL fac[N],ifac[N];

LL pw(LL x,int n){
	LL res = 1;
	for(;n;n>>=1,x=x*x%MOD)if(n&1)res=res*x%MOD;
	return res;
}

LL C(int n,int x){
	return fac[n] * ifac[x] % MOD * ifac[n-x] % MOD;
}

int main(){
	//freopen("test.in","r",stdin);
	cin>>n>>m;
	fac[0] = 1;
	rep(i,1,N-1)fac[i]=fac[i-1]*i%MOD;
	ifac[N-1] = pw(fac[N-1],MOD-2);
	rrep(i,N-2,0)ifac[i]=ifac[i+1]*(i+1)%MOD;
	//cout<<fac[1]*ifac[1]%MOD<<" "<<fac[2]*ifac[2]%MOD<<" "<<fac[3]*ifac[3]%MOD<<endl;
	int s = 3*m;
	LL num = C(s+n-1,n-1);
	LL sub1 = n * C(n+m-2, n-1) % MOD, sub2 = 0;
	for(int i=m+2;i<=min(3*m,n);i+=2){
		int s1 = (s-i)/2;
		sub2 = (sub2 + C(n, i) * C(s1+n-1, n-1)) % MOD;
	}
	cout<<(num - sub1 - sub2 + MOD * 2) % MOD<<endl;
	return 0;
}
```