#include <bits/stdc++.h>
using namespace std;
#ifdef _debug
#define out(i) cout << #i << ' ' << i << ' '
#else 
#define out(i) //
#endif
using ll = long long;
using ull = unsigned long long;
const int maxn = 500001;
const int maxm = 2000000;
const int tomod = 998244353;
ll form(ll a){
	return (a + tomod) % tomod;
}
ll inv[maxm], fa[maxm];
void init(){
	fa[0] = fa[1] = 1;
	inv[0] = inv[1] = 1;
	for(int i = 2;i < maxm;++i){
		fa[i] = form(fa[i - 1] * (ll)i);
		inv[i] = form((tomod - tomod / i) * inv[tomod % i]);
	}
	for(int i = 2;i < maxm;++i)inv[i] = form(inv[i] * inv[i - 1]);
}
ll cof(int a, int b){
	return form(fa[a] * form(inv[b] * inv[a - b]));
} 
ll solve(int n, int k, const int max_odd){
	ll res = 0;
	for(int o = k&1;o <= max_odd;o += 2){
		res = form(res + form(
			cof(n, o) * 
			cof((k-o)/2+n-1, n-1)
		));
	}
	return res;
}
int main(){
	ios_base::sync_with_stdio(0), cin.tie(0);
	init();
	ll k, n;
	cin >> n >> k;
	ll res = solve(n, k * 3, min(n, k));
	res = form(res-form(
		n * form(solve(n, k, min(n, k)) - solve(n-1, k, min(n-1, k)))
	)
	);
	cout << res << '\n';
	assert(res>=0 and res<tomod);
}

### Prompt

Construct a cpp code solution to the problem outlined:

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

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
#ifdef _debug
#define out(i) cout << #i << ' ' << i << ' '
#else 
#define out(i) //
#endif
using ll = long long;
using ull = unsigned long long;
const int maxn = 500001;
const int maxm = 2000000;
const int tomod = 998244353;
ll form(ll a){
	return (a + tomod) % tomod;
}
ll inv[maxm], fa[maxm];
void init(){
	fa[0] = fa[1] = 1;
	inv[0] = inv[1] = 1;
	for(int i = 2;i < maxm;++i){
		fa[i] = form(fa[i - 1] * (ll)i);
		inv[i] = form((tomod - tomod / i) * inv[tomod % i]);
	}
	for(int i = 2;i < maxm;++i)inv[i] = form(inv[i] * inv[i - 1]);
}
ll cof(int a, int b){
	return form(fa[a] * form(inv[b] * inv[a - b]));
} 
ll solve(int n, int k, const int max_odd){
	ll res = 0;
	for(int o = k&1;o <= max_odd;o += 2){
		res = form(res + form(
			cof(n, o) * 
			cof((k-o)/2+n-1, n-1)
		));
	}
	return res;
}
int main(){
	ios_base::sync_with_stdio(0), cin.tie(0);
	init();
	ll k, n;
	cin >> n >> k;
	ll res = solve(n, k * 3, min(n, k));
	res = form(res-form(
		n * form(solve(n, k, min(n, k)) - solve(n-1, k, min(n-1, k)))
	)
	);
	cout << res << '\n';
	assert(res>=0 and res<tomod);
}

```