#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int w = 0, x = 0;
  char c = getchar();
  while (!isdigit(c)) w |= c == '-', c = getchar();
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  return w ? -x : x;
}
namespace star {
const int maxn = 4e6 + 10, mod = 998244353;
inline int fpow(int a, int b) {
  int ans = 1;
  for (; b; b >>= 1, a = 1ll * a * a % mod)
    if (b & 1) ans = 1ll * ans * a % mod;
  return ans;
}
int n, m, mul[maxn], inv[maxn], f[maxn];
inline int C(int n, int m) {
  return 1ll * mul[n] * inv[m] % mod * inv[n - m] % mod;
}
inline int Inv(int x) { return 1ll * inv[x] * mul[x - 1] % mod; }
inline void work() {
  n = read(), m = read();
  int N = n + m;
  mul[0] = inv[0] = 1;
  for (int i = 1; i <= N; i++) mul[i] = 1ll * mul[i - 1] * i % mod;
  inv[N] = fpow(mul[N], mod - 2);
  for (int i = N - 1; i; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
  int t = 0, ans = 0;
  for (int i = 1; i <= n + 1; i++)
    f[i] = (1ll - f[i - 1] + mod) * m % mod * Inv(m + n - i + 1) % mod,
    t = (t + 1ll * i * f[i]) % mod, f[i] = (f[i] + f[i - 1]) % mod;
  for (int i = 1; i <= n; i++)
    ans = (ans +
           (i & 1 ? 1ll : mod - 1ll) * C(n, i) % mod * (i + m) % mod * Inv(i)) %
          mod;
  printf("%lld\n", 1ll * t * ans % mod);
}
}  // namespace star
signed main() {
  star::work();
  return 0;
}
