#include<bits/stdc++.h>
using namespace std;
using ll=long long;
static const ll mod=998244353;
static const ll zero=0;
ll fac[2000005];
ll rev[2000005];
ll modpow(ll x,ll y){
if(y==0)
  return 1;
  else if(y%2==0){
  ll z=modpow(x,y/2);
    return (z*z)%mod;
  }else{
   ll z=modpow(x,y/2);
    return (x*((z*z)%mod))%mod;
  }
}
ll comb(ll x,ll y){
  if(y<=x){
ll a=fac[x];
  ll b=rev[y];
  ll c=rev[x-y];
  return (a*((b*c)%mod))%mod;
  }else
    return 0;

}
ll N,M;
int main(){
  cin>>N>>M;
  fac[0]=1;rev[0]=1;
  for(ll i=1;i<=2000004;i++){
  fac[i]=(i*fac[i-1])%mod;
    rev[i]=modpow(fac[i],mod-2);
  }ll ans=0;
  for(ll i=max(zero,(M-N+1)/2);2*i<=M;i++){
  ll a=comb(N,M-2*i);
    ll b=comb(M+i+N-1,N-1);
    ll c=comb(i+N-1,N-1);c=(2*mod-((c*(M-2*i))%mod))%mod;
    ll d=comb(i+N-2,N-1);d=(2*mod-((d*(N-M+2*i))%mod))%mod;
  b=(b+c+d)%mod;a=(a*b)%mod;ans=(ans+a)%mod;
  }cout<<ans<<endl;
  return 0;
}
### Prompt

Your task is to create 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;
using ll=long long;
static const ll mod=998244353;
static const ll zero=0;
ll fac[2000005];
ll rev[2000005];
ll modpow(ll x,ll y){
if(y==0)
  return 1;
  else if(y%2==0){
  ll z=modpow(x,y/2);
    return (z*z)%mod;
  }else{
   ll z=modpow(x,y/2);
    return (x*((z*z)%mod))%mod;
  }
}
ll comb(ll x,ll y){
  if(y<=x){
ll a=fac[x];
  ll b=rev[y];
  ll c=rev[x-y];
  return (a*((b*c)%mod))%mod;
  }else
    return 0;

}
ll N,M;
int main(){
  cin>>N>>M;
  fac[0]=1;rev[0]=1;
  for(ll i=1;i<=2000004;i++){
  fac[i]=(i*fac[i-1])%mod;
    rev[i]=modpow(fac[i],mod-2);
  }ll ans=0;
  for(ll i=max(zero,(M-N+1)/2);2*i<=M;i++){
  ll a=comb(N,M-2*i);
    ll b=comb(M+i+N-1,N-1);
    ll c=comb(i+N-1,N-1);c=(2*mod-((c*(M-2*i))%mod))%mod;
    ll d=comb(i+N-2,N-1);d=(2*mod-((d*(N-M+2*i))%mod))%mod;
  b=(b+c+d)%mod;a=(a*b)%mod;ans=(ans+a)%mod;
  }cout<<ans<<endl;
  return 0;
}
```