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

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 3e6 + 5;
const int MOD = 998244353;

int N, M;
int fact[MAXN], inv[MAXN];

void load() {
	scanf("%d%d", &N, &M);
}

inline int add(int x, int y) {
	x += y;
	if (x >= MOD)
		return x - MOD;
	if (x < 0)
		return x + MOD;
	return x;
}

inline int mul(int x, int y) {
	return (long long)x * y % MOD;
}

int pot(int x, int y) {
	int res = 1;
	for (; y; y /= 2) {
		if (y % 2)
			res = mul(res, x);
		x = mul(x, x);
	}
	return res;
}

int choose(int n, int k) {
	if (k < 0 || n < k)
		return 0;
	return mul(fact[n], mul(inv[k], inv[n - k]));
}

int stars_bars(int sum, int n) {
	return choose(sum + n - 1, n - 1);
}

int calc_odd(int k) {
	if ((k + M) % 2)
		return 0;
	return mul(choose(N, k), stars_bars((3 * M - k) / 2, N));
}

int solve() {
	fact[0] = inv[0] = 1;
	for (int i = 1; i < MAXN; i++) {
		fact[i] = mul(fact[i - 1], i);
		inv[i] = pot(fact[i], MOD - 2);
	}
	
	int sol = 0;
	for (int i = 0; i <= M && i <= N; i++)
		sol = add(sol, calc_odd(i));
	
	for (int i = 2 * M + 1; i <= 3 * M; i++)
		sol = add(sol, -mul(N, stars_bars(3 * M - i, N - 1)));
	
	return sol;
}

int main() {
	load();
	printf("%d\n", solve());
	return 0;
}