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
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
void plusle(int &a,int b){
    a+=b;if(a>=mod)a-=mod; return;
}
void minun(int &a,int b){
    a-=b; if(a<0)a+=mod; return;
}
int add(int a,int b) {
  a+=b;
  return a>=mod?a-mod:a;
}
int sub(int a,int b) {
  a-=b;
  return a<0?a+mod:a;
}
int mul(int a,int b) {
  return (int)((long long)a*b%mod);
}
int power(int a,int b) {
  int res=1;
  while (b>0) {
    if (b&1) {
      res=mul(res,a);
    }
    a=mul(a,a);
    b>>=1;
  }
  return res;
}
const int M=2e6+10;

int fac[M],invf[M];
void init(){
    fac[0]=1;
    for(int i=1;i<M;i++)
        fac[i]=mul(fac[i-1],i);
    invf[M-1]=power(fac[M-1],mod-2);
    for(int i=M-2;i>=0;i--){
        invf[i]=mul(invf[i+1],i+1);
    }
    return;
}
int ncr(int N,int R){
    if(R>N)return 0;
    if(R==0||N==R)return 1;
    return mul(fac[N],mul(invf[N-R],invf[R]));
}
int m;
int ss(int n,int a){
    /**
    The number of ways to distribute
    sum total A to n target each have even value
    */
    int ans=0;
    /// 2 6 2
    for(int i=a%2;i<=min({n,a,m});i+=2){
        plusle(ans,mul(ncr(n,i),ncr((a-i)/2+n-1,n-1)));
    }
    return ans;
}
int n;
int ans;

int main(){
    scanf("%d%d",&n,&m);
    init();
    ans=ss(n,3*m);
   /// cerr<<ans<<endl;
    minun(ans,mul(n,sub(ss(n,m),ss(n-1,m))));
    printf("%d\n",ans);
    ///supposed that there is

}
