#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i)
#define per(i,a,b) for(int i=(b),i##_end=(a);i>=i##_end;--i)
#define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i)
#define foe(i,a) for(__typeof(a.begin())i=a.begin();i!=a.end();++i)
#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
typedef double ld;
typedef long long L;
typedef vector<int> VI;
typedef pair<int,int> pa;
const int mo=998244353,N=2.5e6+11;
L fpow(L a,L b){
	L r=1;
	for(;b;b>>=1,a=a*a%mo)
		if(b&1)r=r*a%mo;
	return r;
}
L jc[N+2],jcv[N+2];
L C(int n,int m){
	//assert(n<=N);
	return n<m?0:1ll*jc[n]*jcv[m]%mo*jcv[n-m]%mo;
}
L F(int n,int m){
	--n;
	return C(n+m,n);
}
L H(int n,int m){
	if(m<0) return 0;
	return C(n+m,n);
}
int M;
L G(int n,int m){
	if(n==1) return m<=2*M;
	L ans=F(n,m)-n*H(n-1,m-2*M-1);
	ans=(ans%mo+mo)%mo;
	return ans;
}
L GG(int n,int m,int i){
	if(m&1) return 0;
	m/=2;
	if(n==1) return m<=M;
	L ans=F(n,m)-i*H(n-1,m-M)-(n-i)*H(n-1,m-M-1);
	ans=(ans%mo+mo)%mo;
	return ans;

}
int main(){
	jc[0]=1;
	rep(i,1,N)jc[i]=jc[i-1]*i%mo;
	jcv[N]=fpow(jc[N],mo-2);
	per(i,1,N)jcv[i-1]=jcv[i]*i%mo;
	//cerr<<N<<endl;
	int n,m;
	cin>>n>>m;
	M=m;
	L ans=0;
	rep(i,0,m)ans=(ans+C(n,i)*GG(n,3*m-i,i))%mo;
	ans=(ans%mo+mo)%mo;
	cout<<ans<<endl;
	//cerr<<ans/2<<endl;
}
### Prompt

Generate a cpp solution to the following 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

### Response

```cpp
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i)
#define per(i,a,b) for(int i=(b),i##_end=(a);i>=i##_end;--i)
#define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i)
#define foe(i,a) for(__typeof(a.begin())i=a.begin();i!=a.end();++i)
#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
typedef double ld;
typedef long long L;
typedef vector<int> VI;
typedef pair<int,int> pa;
const int mo=998244353,N=2.5e6+11;
L fpow(L a,L b){
	L r=1;
	for(;b;b>>=1,a=a*a%mo)
		if(b&1)r=r*a%mo;
	return r;
}
L jc[N+2],jcv[N+2];
L C(int n,int m){
	//assert(n<=N);
	return n<m?0:1ll*jc[n]*jcv[m]%mo*jcv[n-m]%mo;
}
L F(int n,int m){
	--n;
	return C(n+m,n);
}
L H(int n,int m){
	if(m<0) return 0;
	return C(n+m,n);
}
int M;
L G(int n,int m){
	if(n==1) return m<=2*M;
	L ans=F(n,m)-n*H(n-1,m-2*M-1);
	ans=(ans%mo+mo)%mo;
	return ans;
}
L GG(int n,int m,int i){
	if(m&1) return 0;
	m/=2;
	if(n==1) return m<=M;
	L ans=F(n,m)-i*H(n-1,m-M)-(n-i)*H(n-1,m-M-1);
	ans=(ans%mo+mo)%mo;
	return ans;

}
int main(){
	jc[0]=1;
	rep(i,1,N)jc[i]=jc[i-1]*i%mo;
	jcv[N]=fpow(jc[N],mo-2);
	per(i,1,N)jcv[i-1]=jcv[i]*i%mo;
	//cerr<<N<<endl;
	int n,m;
	cin>>n>>m;
	M=m;
	L ans=0;
	rep(i,0,m)ans=(ans+C(n,i)*GG(n,3*m-i,i))%mo;
	ans=(ans%mo+mo)%mo;
	cout<<ans<<endl;
	//cerr<<ans/2<<endl;
}
```