#include <bits/stdc++.h>
using namespace std;
int const N = 4000001, md = 998244353;
int fc[N + 1], inv[N + 1], fcin[N + 1];
int pw(int x, int p) {
  int an = 1;
  while (p) {
    if (p & 1) an = (long long)an * x % md;
    x = (long long)x * x % md;
    p >>= 1;
  }
  return an;
}
void ad(int &x, int y) {
  if ((x += y) >= md) x -= md;
}
int in(int x) { return pw(x, md - 2); }
int main() {
  fc[0] = 1;
  for (int i = 1; i < (int)(N + 1); ++i) fc[i] = (long long)fc[i - 1] * i % md;
  inv[1] = 1;
  for (int i = 2; i < (int)(N + 1); ++i)
    inv[i] = md - md / i * (long long)inv[md % i] % md;
  fcin[0] = 1;
  for (int i = 1; i < (int)(N + 1); ++i)
    fcin[i] = (long long)fcin[i - 1] * inv[i] % md;
  int n, m;
  scanf("%d%d", &n, &m);
  int pr = 0, can = 0, prf1 = fc[m - 1], prf2 = 0;
  for (int x = 1; x < (int)(n + 1); ++x) {
    ad(prf1, (long long)fc[m - 1 + x] * fcin[x] % md);
    ad(prf2, (long long)fc[m - 1 + x] * fcin[x] % md * (md - x) % md);
    can = (long long)(m + n + 1) * m % md * fc[x] % md * fcin[m + x + 1] % md *
          ((long long)prf1 * (x + 1) % md + prf2) % md;
    ad(can, (long long)m * fc[x] % md * fcin[m + x] % md * pr % md);
    can = (long long)can * in(1 + md - (long long)m * inv[m + x] % md) % md;
    ad(pr, (long long)can * fc[m - 1 + x] % md * fcin[x] % md);
  }
  printf("%d\n", can);
}
