#include <bits/stdc++.h>
using namespace std;

const int MAXN = 3e6 + 5;
const int MOD = 998244353;

int N, M;
int fact[MAXN], inv[MAXN];

void load() {
	scanf("%d%d", &N, &M);
}

inline int add(int x, int y) {
	x += y;
	if (x >= MOD)
		return x - MOD;
	if (x < 0)
		return x + MOD;
	return x;
}

inline int mul(int x, int y) {
	return (long long)x * y % MOD;
}

int pot(int x, int y) {
	int res = 1;
	for (; y; y /= 2) {
		if (y % 2)
			res = mul(res, x);
		x = mul(x, x);
	}
	return res;
}

int choose(int n, int k) {
	if (k < 0 || n < k)
		return 0;
	return mul(fact[n], mul(inv[k], inv[n - k]));
}

int stars_bars(int sum, int n) {
	return choose(sum + n - 1, n - 1);
}

int calc_odd(int k) {
	if ((k + M) % 2)
		return 0;
	return mul(choose(N, k), stars_bars((3 * M - k) / 2, N));
}

int solve() {
	fact[0] = inv[0] = 1;
	for (int i = 1; i < MAXN; i++) {
		fact[i] = mul(fact[i - 1], i);
		inv[i] = pot(fact[i], MOD - 2);
	}
	
	int sol = 0;
	for (int i = 0; i <= M && i <= N; i++)
		sol = add(sol, calc_odd(i));
	
	for (int i = 2 * M + 1; i <= 3 * M; i++)
		sol = add(sol, -mul(N, stars_bars(3 * M - i, N - 1)));
	
	return sol;
}

int main() {
	load();
	printf("%d\n", solve());
	return 0;
}