#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define DBG(v) cerr << #v << " = " << (v) << endl;

const int mod = 998244353;

ll modPow(ll n, ll k) {
	ll res = 1;
	for (n %= mod; k; k >>= 1) {
		if (k & 1)
			res = res * n % mod;
		n = n * n % mod;
	}
	return res;
}

ll modInv(const ll x) {
	return modPow(x, mod - 2);
}

const int MaxFact = (int) 25e5 + 9;

ll fact[MaxFact + 9];
ll factInv[MaxFact + 9];

ll C(const int n, const int k) {
	return fact[n] * factInv[k] % mod * factInv[n - k] % mod;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);

	fact[0] = factInv[0] = 1;
	for (int i = 1; i <= MaxFact; ++i) {
		fact[i] = fact[i - 1] * i % mod;
		factInv[i] = modInv(fact[i]);
	}

	int N, M;
	cin >> N >> M;
	const int S = 3 * M;
	const int R = M - 1;

	ll res = 0;
	for (int odd = 0; odd <= min(N, M); ++odd)
		if ((S - odd) % 2 == 0)
			(res += C(N, odd) * C((S - odd) / 2 + N - 1, N - 1)) %= mod;

	DBG(res);

	res -= N * C(R + N - 1, N - 1);
	cout << (res % mod + mod) % mod;
	return 0;
}

### Prompt

Your challenge is to write 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;
typedef long long ll;
#define DBG(v) cerr << #v << " = " << (v) << endl;

const int mod = 998244353;

ll modPow(ll n, ll k) {
	ll res = 1;
	for (n %= mod; k; k >>= 1) {
		if (k & 1)
			res = res * n % mod;
		n = n * n % mod;
	}
	return res;
}

ll modInv(const ll x) {
	return modPow(x, mod - 2);
}

const int MaxFact = (int) 25e5 + 9;

ll fact[MaxFact + 9];
ll factInv[MaxFact + 9];

ll C(const int n, const int k) {
	return fact[n] * factInv[k] % mod * factInv[n - k] % mod;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);

	fact[0] = factInv[0] = 1;
	for (int i = 1; i <= MaxFact; ++i) {
		fact[i] = fact[i - 1] * i % mod;
		factInv[i] = modInv(fact[i]);
	}

	int N, M;
	cin >> N >> M;
	const int S = 3 * M;
	const int R = M - 1;

	ll res = 0;
	for (int odd = 0; odd <= min(N, M); ++odd)
		if ((S - odd) % 2 == 0)
			(res += C(N, odd) * C((S - odd) / 2 + N - 1, N - 1)) %= mod;

	DBG(res);

	res -= N * C(R + N - 1, N - 1);
	cout << (res % mod + mod) % mod;
	return 0;
}

```