#include <bits/stdc++.h>
using namespace std;
#define rep(i,s,t) for(int i=s;i<t;i++)
typedef long long ll;
#define MAXNUM 2055555
const ll mod=998244353;
ll fact[MAXNUM],ifact[MAXNUM];

ll qpow(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod, b >>= 1;
    }
    return res;
}
void sub(ll &a,ll b)
{
    a-=b;
    if(a<0)a+=mod;
}
ll getC(int a,int b)
{
    return fact[a]*ifact[b]%mod*ifact[a-b]%mod;
}
int main()
{
    int n,m;scanf("%d%d",&n,&m);
    fact[0]=ifact[0]=1;
    rep(i,1,2*m+n+1)fact[i]=fact[i-1]*i%mod,ifact[i]=qpow(fact[i],mod-2);
    ll res=0;
    rep(i,0,min(n,m)+1)
    {
        if(3*m-i>=0&&(3*m-i)%2==0)
            (res+=getC(n,i)*getC((3*m-i)/2+n-1,n-1))%=mod;
        if(m-i>=0&&(m-i)%2==0){
            sub(res,getC(n,i)*getC((m-i)/2+n-1,n-1)%mod*n%mod);
            if(n!=i)(res+=getC(n-1,i)*getC((m-i)/2+n-2,n-2)%mod*n)%=mod;
        }
    }
    printf("%lld\n",res);
}
### 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 <bits/stdc++.h>
using namespace std;
#define rep(i,s,t) for(int i=s;i<t;i++)
typedef long long ll;
#define MAXNUM 2055555
const ll mod=998244353;
ll fact[MAXNUM],ifact[MAXNUM];

ll qpow(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod, b >>= 1;
    }
    return res;
}
void sub(ll &a,ll b)
{
    a-=b;
    if(a<0)a+=mod;
}
ll getC(int a,int b)
{
    return fact[a]*ifact[b]%mod*ifact[a-b]%mod;
}
int main()
{
    int n,m;scanf("%d%d",&n,&m);
    fact[0]=ifact[0]=1;
    rep(i,1,2*m+n+1)fact[i]=fact[i-1]*i%mod,ifact[i]=qpow(fact[i],mod-2);
    ll res=0;
    rep(i,0,min(n,m)+1)
    {
        if(3*m-i>=0&&(3*m-i)%2==0)
            (res+=getC(n,i)*getC((3*m-i)/2+n-1,n-1))%=mod;
        if(m-i>=0&&(m-i)%2==0){
            sub(res,getC(n,i)*getC((m-i)/2+n-1,n-1)%mod*n%mod);
            if(n!=i)(res+=getC(n-1,i)*getC((m-i)/2+n-2,n-2)%mod*n)%=mod;
        }
    }
    printf("%lld\n",res);
}
```