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 JAVA):

Solution:
import java.util.*;
import java.io.*;
import java.lang.*;
import java.math.*;
public class Main {
    public static int[] fact;
    public static int mod;
    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        mod = 998244353;
        fact = new int[3000001];
        fact[0] = 1;
        for(int i=1; i<fact.length; i++) fact[i] = (int)((1L*fact[i-1]*i)%mod);

        long ans = getAns(n, 3*m, 2*m);
        int sign = -1;
        for(int numOnes = m+1; numOnes <= n; numOnes++) {
          //out.println(ans);
          if((3*m - numOnes) % 2 != 0) continue;
          ans += (1L * sign * (1L*choose(n, numOnes) * getAns(n, (3*m-numOnes)/2, m) % mod)) % mod; //* choose(numOnes-1, numOnes-m-1)) % mod;
          //out.println(getAns(n-numOnes, 3*m-numOnes, 2*m));
        //  sign = -1*sign;
          ans += mod;
          ans %= mod;
        }
        out.println(ans);

        // int n = Integer.parseInt(bf.readLine());
        // StringTokenizer st = new StringTokenizer(bf.readLine());
        // int[] a = new int[n]; for(int i=0; i<n; i++) a[i] = Integer.parseInt(st.nextToken());
        // int n = Integer.parseInt(st.nextToken());

        out.close(); System.exit(0);
    }
    // Exponentation
    public static int getAns(int num, int sum, int upperbound) {
      if((sum ==0) && (num == 0)) return 1;
      long ans = 0L + 1L*choose(sum+num-1, num-1) - (1L*num*choose(num-1+(sum-upperbound-1), num-1))%mod  + mod;
      return (int)(ans%mod);
    }
    public static int exp(int base, int e) {
      if(e == 0) return 1;
      if(e == 1) return base;
      int val = exp(base, e/2);
      int ans = (int)(1L*val*val % mod);
      if(e % 2 == 1)
        ans = (int)(1L*ans*base % mod);
      return ans;
    }
    public static int inv(int base) {
      return exp(base, mod-2);
    }
    public static int choose(int n, int m) {
      if(n<0) return 0;
      if(m<0) return 0;
      if(m>n) return 0;
      return (int)(1L*(1L*fact[n]*inv(fact[m]) %mod)*inv(fact[n-m]) % mod);
    }
}