#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll pow(ll x,ll y){
  if(y==0) return 1;
  ll res=pow(x,y/2);
  res*=res;
  res%=mod;
  if(y%2==1) res*=x;
  return res%mod;
}
ll gyaku(ll x){
  return pow(x,mod-2);
}
vector<ll> frac,gfrac;
void set_frac(ll n){
  frac.push_back(1);
  gfrac.push_back(1);
  for(ll i=1;i<=n;i++){
    frac.push_back(frac[i-1]*i%mod);
    gfrac.push_back(gyaku(frac[i]));
  }
}
ll nCr(ll n,ll r){
  ll res=frac[n]*gfrac[r]%mod;
  res*=gfrac[n-r];
  return res%mod;
}



int main(){
  ll n,m;
  cin>>n>>m;
  ll ans=0;
  set_frac(5*max(n,m)+30);

  vector<ll> vec,rsum;
  for(ll i=0;i<3*m+100;i++) vec.push_back(nCr(n+i-2,n-2));
  rsum.push_back(vec[0]);
  for(ll i=1;i<3*m+100;i++) rsum.push_back((rsum[i-1]+vec[i])%mod);
  for(ll t=0;t<=min(n,m);t++){
    ll kans1=0,kans2=0;
    if((m-t)%2==0){
      if(t<n){
        kans1=(nCr(((m-t)/2)+n-2,n-2)*n)%mod;
        kans1*=nCr(n-1,t);
        kans1%=mod;
      }

      kans2+=nCr(((3*m-t)/2)+n-1,n-1);
      kans2%=mod;

      kans2-=(n*rsum[((3*m-t)/2)-m])%mod;
      kans2+=mod;
      kans2%=mod;

      kans2*=nCr(n,t);
      kans2%=mod;
    }
    ans+=(kans1+kans2)%mod;
    ans%=mod;
  }
  cout<<ans<<endl;
}

### Prompt

In Cpp, your task is to solve 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<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll pow(ll x,ll y){
  if(y==0) return 1;
  ll res=pow(x,y/2);
  res*=res;
  res%=mod;
  if(y%2==1) res*=x;
  return res%mod;
}
ll gyaku(ll x){
  return pow(x,mod-2);
}
vector<ll> frac,gfrac;
void set_frac(ll n){
  frac.push_back(1);
  gfrac.push_back(1);
  for(ll i=1;i<=n;i++){
    frac.push_back(frac[i-1]*i%mod);
    gfrac.push_back(gyaku(frac[i]));
  }
}
ll nCr(ll n,ll r){
  ll res=frac[n]*gfrac[r]%mod;
  res*=gfrac[n-r];
  return res%mod;
}



int main(){
  ll n,m;
  cin>>n>>m;
  ll ans=0;
  set_frac(5*max(n,m)+30);

  vector<ll> vec,rsum;
  for(ll i=0;i<3*m+100;i++) vec.push_back(nCr(n+i-2,n-2));
  rsum.push_back(vec[0]);
  for(ll i=1;i<3*m+100;i++) rsum.push_back((rsum[i-1]+vec[i])%mod);
  for(ll t=0;t<=min(n,m);t++){
    ll kans1=0,kans2=0;
    if((m-t)%2==0){
      if(t<n){
        kans1=(nCr(((m-t)/2)+n-2,n-2)*n)%mod;
        kans1*=nCr(n-1,t);
        kans1%=mod;
      }

      kans2+=nCr(((3*m-t)/2)+n-1,n-1);
      kans2%=mod;

      kans2-=(n*rsum[((3*m-t)/2)-m])%mod;
      kans2+=mod;
      kans2%=mod;

      kans2*=nCr(n,t);
      kans2%=mod;
    }
    ans+=(kans1+kans2)%mod;
    ans%=mod;
  }
  cout<<ans<<endl;
}

```