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

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll mod = 998244353;
const int nax = 4e6+10;
ll fac[nax], inv[nax], ifac[nax];
ll ncr(int n, int k) {
  if (n < 0 || k < 0 || k > n) return 0;
  return fac[n]*ifac[k]%mod*ifac[n-k]%mod;
}

int main() {
  ios::sync_with_stdio(0); cin.tie(0);
  int n, m;
  cin >> n >> m;
  fac[0] = ifac[0] = 1;
  for (int i = 1; i < nax; i++) {
    fac[i] = fac[i-1]*i%mod;
    inv[i] = i > 1 ? mod-(mod/i)*inv[mod%i]%mod : 1;
    ifac[i] = ifac[i-1]*inv[i]%mod;
    assert(fac[i]*ifac[i]%mod == 1);
  }
  ll ans = 0;
  for (int k = 0; k <= m && k <= n; k++) {
    if (k%2 != m%2) continue;
    int s = (3*m-k)/2+n;
    ll r = ncr(s-1,n-1);
    (r -= k*ncr(s-1-m,n-1)) %= mod;
    (r -= (n-k)*ncr(s-1-(m+1),n-1)) %= mod;
    (ans += ncr(n,k)*r) %= mod;
  }
  cout << (ans+mod)%mod << endl;
  return 0;

  set<vector<int>> seen;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) {
      if (i == j) continue;
      for (int k = 0; k < 3; k++)
	for (int l = 0; l < 3; l++) {
	  if (k == l) continue;
	  vector<int> v(3,0);
	  v[i] += 2;
	  v[j] += 1;
	  v[k] += 2;
	  v[l] += 1;
	  seen.insert(v);
	}
    }
  for (auto v : seen) {
    if (v[0]%2 + v[1]%2 + v[2]%2 == 0) {
      for (int i : v) cout << i << ' '; cout << endl;
    }
  }
  cout << seen.size() << endl;
}