#include <bits/stdc++.h>

const int MAX_N = int(3e6) + 10;

int n, m;
int fac[MAX_N], inv[MAX_N];

const int mod = 998244353;

int C(int n, int m) {
	return 1LL * fac[n] * inv[m] % mod * inv[n - m] % mod;
}

int mypow(int x, int y, int m) {
	int r = 1;
	while (y) {
		if (y & 1)
			r = 1LL * r * x % m;
		x = 1LL * x * x % m;
		y >>= 1;
	}
	return r;
}

int f(int n, int m, int odd) {
	int r = 0;
	for (int i = 0; i <= n && i <= odd; ++i) {
		if (!(m - i & 1) && m >= i) {
			r = (r + 1LL * C(n, i) * C((m - i) / 2 + n - 1, n - 1) % mod) % mod;
		}
	}
	// printf("f(%d,%d,%d)=%d\n", n, m, odd, r);
	return r;
}

int main() {
	scanf("%d%d", &n, &m);
	fac[0] = inv[0] = 1;
	for (int i = 1; i <= n + 3 * m; ++i) {
		fac[i] = 1LL * fac[i - 1] * i % mod;
		inv[i] = mypow(fac[i], mod - 2, mod);
		// printf("%d %d\n", fac[i], inv[i]);
	}
	int ans = (f(n, 3 * m, m) - 1LL * n * (f(n, m, m) - f(n - 1, m, m)) % mod) % mod;
	if (ans < 0) ans += mod;
	printf("%d\n", ans);
}
### Prompt

Please formulate 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>

const int MAX_N = int(3e6) + 10;

int n, m;
int fac[MAX_N], inv[MAX_N];

const int mod = 998244353;

int C(int n, int m) {
	return 1LL * fac[n] * inv[m] % mod * inv[n - m] % mod;
}

int mypow(int x, int y, int m) {
	int r = 1;
	while (y) {
		if (y & 1)
			r = 1LL * r * x % m;
		x = 1LL * x * x % m;
		y >>= 1;
	}
	return r;
}

int f(int n, int m, int odd) {
	int r = 0;
	for (int i = 0; i <= n && i <= odd; ++i) {
		if (!(m - i & 1) && m >= i) {
			r = (r + 1LL * C(n, i) * C((m - i) / 2 + n - 1, n - 1) % mod) % mod;
		}
	}
	// printf("f(%d,%d,%d)=%d\n", n, m, odd, r);
	return r;
}

int main() {
	scanf("%d%d", &n, &m);
	fac[0] = inv[0] = 1;
	for (int i = 1; i <= n + 3 * m; ++i) {
		fac[i] = 1LL * fac[i - 1] * i % mod;
		inv[i] = mypow(fac[i], mod - 2, mod);
		// printf("%d %d\n", fac[i], inv[i]);
	}
	int ans = (f(n, 3 * m, m) - 1LL * n * (f(n, m, m) - f(n - 1, m, m)) % mod) % mod;
	if (ans < 0) ans += mod;
	printf("%d\n", ans);
}
```