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 = 4000200, mod = 998244353;
int mul(long long a, long long b){
	return a * b % mod;
}
int xp(long long a, long long b){
	int r = 1;
	for(; b; b >>= 1, a = mul(a, a)) if(b&1) r = mul(r, a);
	return r;
}
int fat[maxn], ifat[maxn];
void init(){
	fat[0] = 1;
	for(int i = 1; i < maxn; i++) fat[i] = mul(i, fat[i - 1]);
	ifat[maxn - 1] = xp(fat[maxn - 1], mod - 2);
	for(int i = maxn - 2; i >= 0; i--) ifat[i] = mul(i + 1, ifat[i + 1]);
	for(int i = 0; i < maxn; i++) assert(mul(fat[i], ifat[i]) == 1);
}
int ncr(int n, int r){
	if(r > n) return 0;
	return mul(fat[n], mul(ifat[r], ifat[n - r]));
}
int distribution(int n, int m, int lim, int r2){
	int ans = 0;
	for(int i = r2; i <= min(n, lim); i += 2){
		int miss = (m - i) / 2;
		ans += mul(ncr(n, i), ncr(n + miss - 1, miss));
		if(ans >= mod)
			ans -= mod;
	}
	return ans;
}
int main(){
	init();
	int n, m; cin >> n >> m;
	int res = distribution(n, 3 * m, m, m % 2);
	res += mod - mul(n, distribution(n, m, m, m % 2));
	if(res >= mod)
		res -= mod;
	res += mul(n, distribution(n - 1, m, m, m % 2));
	if(res >= mod)
		res -= mod;
	cout << res << endl;
	return 0;
}