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>
#include <array>
using namespace std;
using ULL = unsigned long long;
using UL = unsigned;
using LL = long long;
#define rep(i, n) for(UL i = 0; i < (n); i++)

struct Problem {

	vector<ULL> fac, inv, ifac;
	static const ULL M = 998244353;
	ULL C(UL n, UL m) { if (n < m) return 0; return fac[n] * ifac[m] % M * ifac[n - m] % M; }

	void Solve() {
		UL N, K; cin >> N >> K;
		{
			ULL sz = N + 2 * K;
			fac.resize(sz); inv.resize(sz); ifac.resize(sz);
			fac[0] = 1; for (ULL i = 1; i < sz; i++) fac[i] = fac[i - 1] * i % M;
			inv[1] = 1; for (ULL i = 2; i < sz; i++) inv[i] = M - (M / i * inv[M % i]) % M;
			ifac[0] = 1; for (ULL i = 1; i < sz; i++) ifac[i] = ifac[i - 1] * inv[i] % M;
		}
		ULL ans = 0;
		for (ULL m = K % 2; m <= min(K, N); m += 2) {
			ULL oe = C(N, m);
			ULL al = C((3 * K - m) / 2 + N - 1, N - 1);
			ULL ov = C((K - m) / 2 + N - 1, N - 1) * m % M;
			ULL ev = C((K - m) / 2 + N - 2, N - 1) * (N - m) % M;
			ULL dance = (al + (M - ov) + (M - ev)) % M;
			dance = dance * oe % M;
			//cout << m << ":" << oe << " " << al << " " << ov << " " << ev << endl;
			ans += dance;
		}
		cout << (ans % M) << endl;
	}

	Problem();
};
int main() {
	unique_ptr<Problem> p(new Problem());
	p->Solve();
	return 0;
}
Problem::Problem() {
	cout << fixed << setprecision(10);
}