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;

constexpr long long MOD = 998244353;
vector<long long> F, RF;

long long Calc(long long A, long long B) {
	if (B == 0) return 1;
	if (B % 2 == 0) {
		long long C = Calc(A, B / 2);
		return (C * C) % MOD;
	}
	return (A * Calc(A, B - 1)) % MOD;
}

void init() {
	F.resize(2500001), RF.resize(2500001);
	F[0] = F[1] = RF[0] = RF[1] = 1;
	for (int i = 2; i <= 2500000; i++) F[i] = (F[i - 1] * i) % MOD;
	RF[2500000] = Calc(F[2500000], MOD - 2);
	for (int i = 2499999; i >= 2; i--) RF[i] = (RF[i + 1] * (i + 1)) % MOD;
}

long long Comb(long long A, long long B) {
	if (B < 0 || A < B) return 0;
	return (F[A] * ((RF[A - B] * RF[B]) % MOD)) % MOD;
}

long long Solve(long long X, long long Y, long long Z) {
	long long COUNT = 0;
	for (int P = 0; P <= Y && P <= Z; P++) {
		if ((X - P) < 0 || (X - P) % 2 == 1) continue;
		long long Q = (X - P) / 2;
		COUNT += (Comb(Q + Z - 1, Q) * Comb(Z, P)) % MOD;
		COUNT %= MOD;
	}
	return COUNT;
}

int main() {
	init();
	long long N, M;
	cin >> N >> M;
	long long ANS1 = Solve(M * 3, M, N), ANS2 = (Solve(M, M, N) - Solve(M, M, N - 1) + MOD) % MOD;
	cout << (ANS1 + (MOD - ANS2) * N) % MOD << endl;
}