#include <iostream>

using namespace std;

typedef long long ll;

#define M 998244353

#define Z 3000000

ll pot(int a, int b) {
	if (b == 0) return 1;
	ll x = pot(a,b/2);
	x = x*x%M;
	if (b%2) x = x*a%M;
	return x;
}

ll inv(ll x) {
	return pot(x,M-2);
}

ll ff[Z+1];
ll ii[Z+1];

ll ncr(int a, int b) {
	return ff[a]*ii[b]%M*ii[a-b]%M;
}

ll calc(int n, int k) {
	return ncr(k+n-1,k);
}

int n, m;

int main() {
	ff[0] = 1;
	for (int i = 1; i <= Z; i++) ff[i] = ff[i-1]*i%M;
	ii[Z] = inv(ff[Z]);
	for (int i = Z-1; i >= 0; i--) ii[i] = ii[i+1]*(i+1)%M;
	cin >> n >> m;
	ll x = calc(n,2*m+m);
	for (int i = 2*m+1; i <= 2*m+m; i++) {
		ll u = n*calc(n-1,2*m+m-i)%M;
		x = (x-u)%M;
		if (x < 0) x += M;
	}

	if (m < n) {
		for (int i = m+1; i <= n; i++) {
			if (2*m+m-i < 0 || (2*m+m-i)%2 == 1) continue;
			ll u = ncr(n,i)*calc(n,(2*m+m-i)/2)%M;
			x = (x-u)%M;
			if (x < 0) x += M;
		}
	}
	cout << x << "\n";
}

### Prompt

Construct a Cpp code solution to the problem outlined:

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>

using namespace std;

typedef long long ll;

#define M 998244353

#define Z 3000000

ll pot(int a, int b) {
	if (b == 0) return 1;
	ll x = pot(a,b/2);
	x = x*x%M;
	if (b%2) x = x*a%M;
	return x;
}

ll inv(ll x) {
	return pot(x,M-2);
}

ll ff[Z+1];
ll ii[Z+1];

ll ncr(int a, int b) {
	return ff[a]*ii[b]%M*ii[a-b]%M;
}

ll calc(int n, int k) {
	return ncr(k+n-1,k);
}

int n, m;

int main() {
	ff[0] = 1;
	for (int i = 1; i <= Z; i++) ff[i] = ff[i-1]*i%M;
	ii[Z] = inv(ff[Z]);
	for (int i = Z-1; i >= 0; i--) ii[i] = ii[i+1]*(i+1)%M;
	cin >> n >> m;
	ll x = calc(n,2*m+m);
	for (int i = 2*m+1; i <= 2*m+m; i++) {
		ll u = n*calc(n-1,2*m+m-i)%M;
		x = (x-u)%M;
		if (x < 0) x += M;
	}

	if (m < n) {
		for (int i = m+1; i <= n; i++) {
			if (2*m+m-i < 0 || (2*m+m-i)%2 == 1) continue;
			ll u = ncr(n,i)*calc(n,(2*m+m-i)/2)%M;
			x = (x-u)%M;
			if (x < 0) x += M;
		}
	}
	cout << x << "\n";
}

```