#include <bits/stdc++.h>
using namespace std;
#define db(x) cerr << #x << "=" << x << endl
#define db2(x, y) cerr << #x << "=" << x << "," << #y << "=" << y << endl
#define db3(x, y, z) cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z << endl
#define dbv(v) cerr << #v << "="; for (auto _x : v) cerr << _x << ", "; cerr << endl
#define dba(a, n) cerr << #a << "="; for (int _i = 0; _i < (n); ++_i) cerr << a[_i] << ", "; cerr << endl
typedef long long ll;
typedef long double ld;
const int MAXN = 500005;
const ll MOD = 998244353;
ll fac[MAXN], invfac[MAXN];
ll binom(ll a, ll b) {
	if (b < 0) return 0;
	if (b > a) return 0;
	return (((fac[a] * invfac[b]) % MOD) * invfac[a - b]) % MOD;
}
ll modex(ll a, ll p, ll m = MOD) {
	if (!p) return 1;
	if (p & 1) return a * modex(a, p - 1, m) % m;
	ll v = modex(a, p >> 1, m);
	return v * v % m;
}
ll pown[MAXN], powm[MAXN];
int main() {
	fac[0] = 1;
	for (int i = 1; i < MAXN; ++i)
		fac[i] = fac[i - 1] * i % MOD;
	invfac[MAXN - 1] = modex(fac[MAXN - 1], MOD - 2);
	for (int i = MAXN - 2; i >= 0; --i)
		invfac[i] = invfac[i + 1] * (i + 1) % MOD;
	int n, m;
	scanf("%d%d", &n, &m);
	powm[0] = pown[0] = 1;
	for (int i = 1; i <= n; ++i) powm[i] = powm[i - 1] * (m + 1) % MOD;
	for (int i = 1; i <= m; ++i) pown[i] = pown[i - 1] * (n + 1) % MOD;
	ll ans = pown[m] * powm[n] % MOD;
	for (int k = 1; k <= min(n, m); ++k) {
		ll v = binom(m, k) * fac[n] % MOD * invfac[n - k] % MOD * pown[m - k] % MOD * powm[n - k] % MOD;
		if (k & 1) ans -= v;
		else ans += v;
		ans %= MOD;
	}
	if (ans < 0) ans += MOD;
	printf("%lld\n", ans);
}
