#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch > '9' || ch < '0') { if(ch == '-') f = -1; ch = getchar(); }
	do x = x * 10 + ch - 48, ch = getchar(); while(ch >= '0' && ch <= '9');
	return x * f;
}

typedef long long ll;
const int MAXN = 500001;
const int mod = 998244353;

int n,m;
ll fac[MAXN],ifac[MAXN];
ll pown[MAXN],powm[MAXN];

ll C(int n,int m) {
	return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}

int main() {
	n = read(), m = read();
	fac[0] = 1;
	for(int i = 1;i <= n || i <= m;i++) fac[i] = (fac[i - 1] * i) % mod;
	ifac[0] = ifac[1] = 1;
	for(int i = 2;i <= n || i <= m;i++) ifac[i] = ((mod - mod / i) * ifac[mod % i]) % mod;
	for(int i = 2;i <= n || i <= m;i++) ifac[i] = (ifac[i - 1] * ifac[i]) % mod;
	pown[0] = powm[0] = 1;
	for(int i = 1;i <= m;i++) pown[i] = (pown[i - 1] * (n + 1)) % mod;
	for(int i = 1;i <= n;i++) powm[i] = (powm[i - 1] * (m + 1)) % mod;
	ll ans = 0;
	for (int i = 0;i <= n && i <= m;i++) {
		ll res = (C(n,i) * C(m,i)) % mod;
		res = res * fac[i] % mod;
		res = res * pown[m - i] % mod;
		res = res * powm[n - i] % mod;
		if(i & 1) ans = (ans + mod - res) % mod;
		else ans = (ans + res) % mod;
	}
	std::printf("%lld\n",ans);
	return 0;
}
