#include<bits/stdc++.h>
#define LL long long
#define F(x,y,z) for(int x=y;x<=z;++x)
#define D(x,y,z) for(int x=y;x>=z;--x)
using namespace std;
const int Mod=998244353;
const int N=30000010;
const int maxn=30000001;
LL Min(LL x,LL y){return x<y?x:y;}
LL Max(LL x,LL y){return x>y?x:y;}
LL R(){
    LL ans=0,f=1;char c=getchar();
    for(;c<'0'||c>'9';c=getchar()) if (c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar()) ans=ans*10+c-'0';
    return ans*f;
}
LL jc[N],ni[N],n,m;
LL C(LL n,LL m){return jc[n]*ni[m]%Mod*ni[n-m]%Mod;}
LL Calc(LL n,LL m,LL js){
	LL ans=0;
	int ma=min(n,m);
	F(i,0,ma){
		if((i+m)&1)continue;
		ans+=C(n,i)*C(js+(m-i)/2+n-1,n-1);
		ans%=Mod;
	}
	return ans;
}
LL Pow(LL x,LL bs){
	LL an=1;
	for(;bs;bs>>=1,x=x*x%Mod)
		if(bs&1)an=an*x%Mod;
	return an; 
}
void Pre(){
	jc[0]=ni[0]=1;
	F(i,1,maxn)jc[i]=jc[i-1]*i%Mod;
	ni[maxn]=Pow(jc[maxn],Mod-2);
	D(i,maxn-1,1)ni[i]=ni[i+1]*(i+1)%Mod;
}
int main(){
	Pre();
	n=R();m=R();
	LL ans=Calc(n,m,m);
	ans-=n*(Calc(n,m,0)-Calc(n-1,m,0));
	ans%=Mod;ans+=Mod;ans%=Mod;
	cout<<ans<<'\n';
    return 0;
}
### Prompt

Create a solution in Cpp for 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>
#define LL long long
#define F(x,y,z) for(int x=y;x<=z;++x)
#define D(x,y,z) for(int x=y;x>=z;--x)
using namespace std;
const int Mod=998244353;
const int N=30000010;
const int maxn=30000001;
LL Min(LL x,LL y){return x<y?x:y;}
LL Max(LL x,LL y){return x>y?x:y;}
LL R(){
    LL ans=0,f=1;char c=getchar();
    for(;c<'0'||c>'9';c=getchar()) if (c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar()) ans=ans*10+c-'0';
    return ans*f;
}
LL jc[N],ni[N],n,m;
LL C(LL n,LL m){return jc[n]*ni[m]%Mod*ni[n-m]%Mod;}
LL Calc(LL n,LL m,LL js){
	LL ans=0;
	int ma=min(n,m);
	F(i,0,ma){
		if((i+m)&1)continue;
		ans+=C(n,i)*C(js+(m-i)/2+n-1,n-1);
		ans%=Mod;
	}
	return ans;
}
LL Pow(LL x,LL bs){
	LL an=1;
	for(;bs;bs>>=1,x=x*x%Mod)
		if(bs&1)an=an*x%Mod;
	return an; 
}
void Pre(){
	jc[0]=ni[0]=1;
	F(i,1,maxn)jc[i]=jc[i-1]*i%Mod;
	ni[maxn]=Pow(jc[maxn],Mod-2);
	D(i,maxn-1,1)ni[i]=ni[i+1]*(i+1)%Mod;
}
int main(){
	Pre();
	n=R();m=R();
	LL ans=Calc(n,m,m);
	ans-=n*(Calc(n,m,0)-Calc(n-1,m,0));
	ans%=Mod;ans+=Mod;ans%=Mod;
	cout<<ans<<'\n';
    return 0;
}
```