#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1e7 + 7;
const int P = 998244353;
int fac[maxn], inv[maxn];
int fpw(int x, int y){
	int ans = 1;
	for (; y; y >>= 1, x = 1LL * x * x % P)
		if (y & 1)
			ans = 1LL * ans * x % P;
	return ans;
}
int C(int n, int m){
	return 1LL * fac[n] * inv[m] % P * inv[n - m] % P;
}
int add(int x, int y){
	x += y;
	return x >= P ? x - P : x;
}
int calc(int n, int S, int m){
	int ans = 0;
	for (int i = 0; i <= min(S, min(n, m)); ++ i)
		if ((S - i) % 2 == 0){
			int s = (S - i) / 2;
			ans = add(ans, 1LL * C(n, i) * C(s + n - 1, n - 1) % P);
		}
	return ans;
}
int main(){
	int n, m;
	cin >> n >> m;
	fac[0] = 1;
	for (int i = 1; i <= 1e7; ++ i)
		fac[i] = 1LL * fac[i - 1] * i % P;
	inv[(int)(1e7)] = fpw(fac[(int)(1e7)], P - 2);
	for (int i = 1e7 - 1; i >= 0; -- i)
		inv[i] = 1LL * inv[i + 1] * (i + 1) % P;
	cout << add(calc(n, 3 * m, m), P - 1LL * n * add(calc(n, m, m), P - calc(n - 1, m, m)) % P) << endl;
}
### Prompt

Generate 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 <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1e7 + 7;
const int P = 998244353;
int fac[maxn], inv[maxn];
int fpw(int x, int y){
	int ans = 1;
	for (; y; y >>= 1, x = 1LL * x * x % P)
		if (y & 1)
			ans = 1LL * ans * x % P;
	return ans;
}
int C(int n, int m){
	return 1LL * fac[n] * inv[m] % P * inv[n - m] % P;
}
int add(int x, int y){
	x += y;
	return x >= P ? x - P : x;
}
int calc(int n, int S, int m){
	int ans = 0;
	for (int i = 0; i <= min(S, min(n, m)); ++ i)
		if ((S - i) % 2 == 0){
			int s = (S - i) / 2;
			ans = add(ans, 1LL * C(n, i) * C(s + n - 1, n - 1) % P);
		}
	return ans;
}
int main(){
	int n, m;
	cin >> n >> m;
	fac[0] = 1;
	for (int i = 1; i <= 1e7; ++ i)
		fac[i] = 1LL * fac[i - 1] * i % P;
	inv[(int)(1e7)] = fpw(fac[(int)(1e7)], P - 2);
	for (int i = 1e7 - 1; i >= 0; -- i)
		inv[i] = 1LL * inv[i + 1] * (i + 1) % P;
	cout << add(calc(n, 3 * m, m), P - 1LL * n * add(calc(n, m, m), P - calc(n - 1, m, m)) % P) << endl;
}
```