#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int first = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) {
    if (ch == '-') f = -1;
  }
  for (; isdigit(ch); ch = getchar()) {
    first = first * 10 + ch - 48;
  }
  return first * f;
}
const int mxN = 4e6;
const int P = 998244353;
int n, m;
long long fact[mxN + 3], facti[mxN + 3];
long long f[mxN + 3];
long long quickpow(long long first, long long second) {
  long long cur = first, ret = 1ll;
  for (int i = 0; second; i++) {
    if (second & (1ll << i)) {
      second -= (1ll << i);
      ret = ret * cur % P;
    }
    cur = cur * cur % P;
  }
  return ret;
}
long long mulinv(long long first) { return quickpow(first, P - 2); }
long long comb(long long first, long long second) {
  return first < 0 || second < 0 || first < second
             ? 0ll
             : fact[first] * facti[second] % P * facti[first - second] % P;
}
long long combi(long long first, long long second) {
  return first < 0 || second < 0 || first < second
             ? 0ll
             : facti[first] * fact[second] % P * fact[first - second] % P;
}
int main() {
  fact[0] = 1ll;
  for (int i = 1; i <= mxN; i++) fact[i] = fact[i - 1] * i % P;
  facti[mxN] = quickpow(fact[mxN], P - 2);
  for (int i = mxN - 1; i >= 0; i--) facti[i] = facti[i + 1] * (i + 1ll) % P;
  n = read(), m = read();
  long long coe1 = 0ll, cur = 0ll;
  for (int k = 0; k <= n; k++) {
    coe1 = (coe1 + comb(n, k) * combi(n + m, k + 1) % P * m) % P;
  }
  f[n] = 0ll;
  for (int i = n - 1; i >= 0; i--) {
    long long coe2 = m * fact[n - i] % P * facti[n + m - i] % P * cur % P;
    long long coe3 = m * fact[n + m - i - 1] % P * facti[n + m - i] % P;
    f[i] = mulinv(P + 1ll - coe3) * (coe1 + coe2) % P;
    cur = (cur + fact[n + m - i - 1] * facti[n - i] % P * f[i]) % P;
  }
  printf("%lld\n", f[0]);
  return 0;
}
