#include <bits/stdc++.h>
using namespace std;

const int N = 2e6 + 10;
const int mod = 998244353;

inline int fpow (int a, int b) {
	int ret = 1;
	while (b) {
		if (b & 1) ret = 1ll * ret * a % mod;
		a = 1ll * a * a % mod;
		b >>= 1;
	}
	return ret;
}

int f[N], invf[N];

void predeal (int n) {
	f[0] = invf[0] = 1;
	for (int i = 1; i <= n; i++) {
		f[i] = 1ll * f[i - 1] * i % mod;
	}
	invf[n] = fpow(f[n], mod - 2);
	for (int i = n - 1; i >= 1; i--) {
		invf[i] = 1ll * invf[i + 1] * (i + 1) % mod; 
	}
}

inline int C (int n, int m) {
	return n >= m ? 1ll * f[n] * invf[m] % mod * invf[n - m] % mod : 0;
}

int main (void) {
	predeal(2e6);

	int n, m, ans = 0;
	scanf("%d%d", &n, &m);
	for (int i = 0; i <= m; i++) {
		if ((m - i) & 1) continue;
		ans += 1ll * C(n, i) * C((3 * m - i) / 2 + n - 1, n - 1) % mod;
		if (ans >= mod) ans -= mod;
	}
	for (int i = 0; i < m; i++) {
		if ((m - 1 - i) & 1) continue;
		ans -= 1ll * C(n, 1) * C(n, i) % mod * C((m - 1 - i) / 2 + n - 1, n - 1) % mod;
		if (ans < 0) ans += mod;
	}
	printf("%d\n", ans);
}
### Prompt

Your task is to create 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;

const int N = 2e6 + 10;
const int mod = 998244353;

inline int fpow (int a, int b) {
	int ret = 1;
	while (b) {
		if (b & 1) ret = 1ll * ret * a % mod;
		a = 1ll * a * a % mod;
		b >>= 1;
	}
	return ret;
}

int f[N], invf[N];

void predeal (int n) {
	f[0] = invf[0] = 1;
	for (int i = 1; i <= n; i++) {
		f[i] = 1ll * f[i - 1] * i % mod;
	}
	invf[n] = fpow(f[n], mod - 2);
	for (int i = n - 1; i >= 1; i--) {
		invf[i] = 1ll * invf[i + 1] * (i + 1) % mod; 
	}
}

inline int C (int n, int m) {
	return n >= m ? 1ll * f[n] * invf[m] % mod * invf[n - m] % mod : 0;
}

int main (void) {
	predeal(2e6);

	int n, m, ans = 0;
	scanf("%d%d", &n, &m);
	for (int i = 0; i <= m; i++) {
		if ((m - i) & 1) continue;
		ans += 1ll * C(n, i) * C((3 * m - i) / 2 + n - 1, n - 1) % mod;
		if (ans >= mod) ans -= mod;
	}
	for (int i = 0; i < m; i++) {
		if ((m - 1 - i) & 1) continue;
		ans -= 1ll * C(n, 1) * C(n, i) % mod * C((m - 1 - i) / 2 + n - 1, n - 1) % mod;
		if (ans < 0) ans += mod;
	}
	printf("%d\n", ans);
}
```