#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int mod = 998244353;
const int N = 2e7 + 11;
int fac[N], inv[N], n, m;
inline LL A(LL x, LL y){
    return x + y - (x + y >= mod ? mod : 0);
}
int C(int m, int n){
    if(m > n)return 0;
    return 1LL * fac[n] * inv[m] % mod * inv[n-m] % mod;
}
LL f(int n, int m, int k){
    LL ans = 0;
    for(int i = m % 2;i <= k; i += 2){
        ans = A(ans, 1LL * C(i, n) * C(n - 1, (m - i) / 2 + n - 1) % mod);
    }
    return ans;
}
int main(){
    cin>>n>>m;
    inv[0] = inv[1] = fac[1] = fac[0] = 1;
    for(int i = 2;i < N; i++){
        fac[i] = 1LL * fac[i-1] * i % mod;
        inv[i] = (mod - 1LL * (mod / i) * inv[mod%i] % mod) % mod;
    }
    for(int i = 2;i < N; i++){
        inv[i] = 1LL * inv[i] * inv[i-1] % mod;
    }
    LL ans = A(f(n, 3 * m, m), mod - 1LL * n * (A(f(n, m, m), mod - f(n - 1, m, m))) % 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;
#define LL long long
const int mod = 998244353;
const int N = 2e7 + 11;
int fac[N], inv[N], n, m;
inline LL A(LL x, LL y){
    return x + y - (x + y >= mod ? mod : 0);
}
int C(int m, int n){
    if(m > n)return 0;
    return 1LL * fac[n] * inv[m] % mod * inv[n-m] % mod;
}
LL f(int n, int m, int k){
    LL ans = 0;
    for(int i = m % 2;i <= k; i += 2){
        ans = A(ans, 1LL * C(i, n) * C(n - 1, (m - i) / 2 + n - 1) % mod);
    }
    return ans;
}
int main(){
    cin>>n>>m;
    inv[0] = inv[1] = fac[1] = fac[0] = 1;
    for(int i = 2;i < N; i++){
        fac[i] = 1LL * fac[i-1] * i % mod;
        inv[i] = (mod - 1LL * (mod / i) * inv[mod%i] % mod) % mod;
    }
    for(int i = 2;i < N; i++){
        inv[i] = 1LL * inv[i] * inv[i-1] % mod;
    }
    LL ans = A(f(n, 3 * m, m), mod - 1LL * n * (A(f(n, m, m), mod - f(n - 1, m, m))) % mod);
    cout<<ans<<endl;
    return 0;
}

```