#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <assert.h>
using namespace std;

#define N 5000001
#define mod 998244353
#define ll long long

int fac[N], invFac[N];
int mypow(int x, int c) {
	int ret = 1;
	while (c > 0) {
		if (c & 1) {
			ret = (ll)ret*x%mod;
		}
		c /= 2;
		x = (ll)x*x%mod;
	}
	return ret;
}
int combi(int n, int c) {
	int ret = (ll)fac[n] * invFac[c] % mod;
	ret = (ll)ret*invFac[n - c] % mod;

	return ret;
}
int add(int x, int y) {
	int ret = x + y;
	if (ret < 0) {
		ret += mod;
	}
	if (ret >= mod) {
		ret -= mod;
	}
	return ret;
}
int mul(int x, int y) {
	return (ll)x*y%mod;
}
void solve() {
	int n, m; scanf("%d %d", &n, &m);
	fac[0] = 1; invFac[0] = 1;
	for (int i = 1; i <N; ++i) {
		fac[i] = (ll)fac[i - 1] * i%mod;
		invFac[i] = mypow(fac[i], mod - 2);
	}
	int ret = 0;
	int maxOdd = min(n, m);
	for (int odd = 0; odd <= maxOdd; ++odd) {
		int sum = 3 * m - odd;
		if (sum % 2 == 0) {
			sum /= 2;
			int tmp = combi(sum + n - 1, n - 1);
			tmp = mul(tmp, combi(n, odd));
			ret = add(ret, tmp);
		}
	}
	for (int maxSum = 2 * m + 1; maxSum <= 3 * m; ++maxSum) {
		int rem = 3 * m - maxSum;
		int tmp = combi(rem + n - 2, n - 2);
		tmp = (ll)tmp*n%mod;
		ret = add(ret, -tmp);
	}
	printf("%d\n", ret);
}
int main()
{
	//freopen("input.txt", "r", stdin);
	solve();
	return 0;
}
### Prompt

Please create a solution in cpp 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 <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <assert.h>
using namespace std;

#define N 5000001
#define mod 998244353
#define ll long long

int fac[N], invFac[N];
int mypow(int x, int c) {
	int ret = 1;
	while (c > 0) {
		if (c & 1) {
			ret = (ll)ret*x%mod;
		}
		c /= 2;
		x = (ll)x*x%mod;
	}
	return ret;
}
int combi(int n, int c) {
	int ret = (ll)fac[n] * invFac[c] % mod;
	ret = (ll)ret*invFac[n - c] % mod;

	return ret;
}
int add(int x, int y) {
	int ret = x + y;
	if (ret < 0) {
		ret += mod;
	}
	if (ret >= mod) {
		ret -= mod;
	}
	return ret;
}
int mul(int x, int y) {
	return (ll)x*y%mod;
}
void solve() {
	int n, m; scanf("%d %d", &n, &m);
	fac[0] = 1; invFac[0] = 1;
	for (int i = 1; i <N; ++i) {
		fac[i] = (ll)fac[i - 1] * i%mod;
		invFac[i] = mypow(fac[i], mod - 2);
	}
	int ret = 0;
	int maxOdd = min(n, m);
	for (int odd = 0; odd <= maxOdd; ++odd) {
		int sum = 3 * m - odd;
		if (sum % 2 == 0) {
			sum /= 2;
			int tmp = combi(sum + n - 1, n - 1);
			tmp = mul(tmp, combi(n, odd));
			ret = add(ret, tmp);
		}
	}
	for (int maxSum = 2 * m + 1; maxSum <= 3 * m; ++maxSum) {
		int rem = 3 * m - maxSum;
		int tmp = combi(rem + n - 2, n - 2);
		tmp = (ll)tmp*n%mod;
		ret = add(ret, -tmp);
	}
	printf("%d\n", ret);
}
int main()
{
	//freopen("input.txt", "r", stdin);
	solve();
	return 0;
}
```