#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vl;
const ll MN = 1001000;
const ll MM = 500500;
ll w[MM*3],x[MM*3],pr[MM*3];
const ll M = 998244353;
inline ll mul(ll a, ll b) {
	return (a*b)%M;
}
ll bp(ll b, ll p) {
	ll ac = 1;
	while(p) {
		if(p&1) {ac = mul(ac,b);}
		b = mul(b,b);
		p >>= 1;
	}
	return ac;
}
ll fp[MN*2],ip[MN*2];
ll fac(ll v) {
	if(v <= 1) return 1;
	if(fp[v] != -1) return fp[v];
	if(v > 10000) fac(v-10000);
	return fp[v] = mul(fac(v-1),v);
}
ll inv(ll v) {
	return bp(v,M-2);
}
ll ifac(ll v) {
	if(v <= 1) return 1;
	if(ip[v] != -1) return ip[v];
	return ip[v] = inv(fac(v));
}
ll ch(ll n, ll k) {
	if(k < 0 || k > n) return 0;
	return mul(mul(fac(n),ifac(n-k)),ifac(k));
}
int main() {
	memset(fp,-1,sizeof(fp));
	memset(ip,-1,sizeof(ip));
	ll n,m;
	cin >> n >> m;
	ll sm = 0;
	for(int i=0;i<=2*m;i++) {
		w[i] = ch(n+i-1,n-1);
		if(i > m) {
			sm += ch(n+i-(m+1)-2,n-2);
			sm %= M;
		}
		w[i] -= mul(n,sm);
		w[i] = (w[i]+M)%M;
	}
	for(int i=0;i<=2*m;i++) {
		x[i] = w[i];
		if(i >= m) {
			ll rem = ch(n+i-m-2,n-2);
			x[i] -= mul(n,rem);
		}
		x[i] = (x[i]+M)%M;
	}
	ll res = 0;
	for(int i=0;i<2*m;i++) {
		ll sa = 3*m-2*i;
		if(sa > m) continue;
		if(sa < 0) continue;
		res += mul(ch(n-1,sa),w[i])+mul(ch(n-1,sa-1),x[i]);
		res %= M;
	}
	cout << res << '\n';
}
### 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;
typedef long long ll;
typedef vector<ll> vl;
const ll MN = 1001000;
const ll MM = 500500;
ll w[MM*3],x[MM*3],pr[MM*3];
const ll M = 998244353;
inline ll mul(ll a, ll b) {
	return (a*b)%M;
}
ll bp(ll b, ll p) {
	ll ac = 1;
	while(p) {
		if(p&1) {ac = mul(ac,b);}
		b = mul(b,b);
		p >>= 1;
	}
	return ac;
}
ll fp[MN*2],ip[MN*2];
ll fac(ll v) {
	if(v <= 1) return 1;
	if(fp[v] != -1) return fp[v];
	if(v > 10000) fac(v-10000);
	return fp[v] = mul(fac(v-1),v);
}
ll inv(ll v) {
	return bp(v,M-2);
}
ll ifac(ll v) {
	if(v <= 1) return 1;
	if(ip[v] != -1) return ip[v];
	return ip[v] = inv(fac(v));
}
ll ch(ll n, ll k) {
	if(k < 0 || k > n) return 0;
	return mul(mul(fac(n),ifac(n-k)),ifac(k));
}
int main() {
	memset(fp,-1,sizeof(fp));
	memset(ip,-1,sizeof(ip));
	ll n,m;
	cin >> n >> m;
	ll sm = 0;
	for(int i=0;i<=2*m;i++) {
		w[i] = ch(n+i-1,n-1);
		if(i > m) {
			sm += ch(n+i-(m+1)-2,n-2);
			sm %= M;
		}
		w[i] -= mul(n,sm);
		w[i] = (w[i]+M)%M;
	}
	for(int i=0;i<=2*m;i++) {
		x[i] = w[i];
		if(i >= m) {
			ll rem = ch(n+i-m-2,n-2);
			x[i] -= mul(n,rem);
		}
		x[i] = (x[i]+M)%M;
	}
	ll res = 0;
	for(int i=0;i<2*m;i++) {
		ll sa = 3*m-2*i;
		if(sa > m) continue;
		if(sa < 0) continue;
		res += mul(ch(n-1,sa),w[i])+mul(ch(n-1,sa-1),x[i]);
		res %= M;
	}
	cout << res << '\n';
}
```