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
#include<bits/stdc++.h>
using namespace std;

inline int read()
{
	int x = 0, f = 1; char ch = getchar();
	for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') f = -1;
	for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
	return x * f;
}

const int N = 3e6 + 5;
const int P = 998244353;
int fac[N], ifac[N];

int Pow(int x, int t)
{
	int res = 1;
	for (; t; t >>= 1, x = 1LL * x * x % P)
		if (t & 1) res = 1LL * res * x % P;
	return res;
}

int C(int n, int m)
{
	if (n < m || m < 0) return 0;
	return 1LL * fac[n] * ifac[m] % P * ifac[n - m] % P;
}

int solve(int n, int m, int k)
{
	int res = 0;
	for (int i = m & 1; i <= k; i += 2)
		res = (res + 1LL * C(n, i) * C((m - i) / 2 + n - 1, n - 1) % P) % P;
	return res;
}

int main()
{
	int n = read();
	int m = read();
	
	fac[0] = 1;
	for (int i = 1; i < N; ++i) fac[i] = 1LL * i * fac[i - 1] % P;
	ifac[N - 1] = Pow(fac[N - 1], P - 2);
	for (int i = N - 1; i >= 1; --i) ifac[i - 1] = 1LL * i * ifac[i] % P;
	
	int ans = solve(n, 3 * m, m);
	ans = (ans - 1LL * n * (solve(n, m, m) - solve(n - 1, m, m)) % P + P) % P;
	printf("%d\n", ans);
	
	return 0;
}
