#include<bits/stdc++.h>
#define LL long long
#define MOD 998244353
using namespace std;
template<typename T> void chkmn(T &a, const T &b)
{
(a > b) && (a = b);
}
template<typename T> void chkmx(T &a, const T &b)
{
(a < b) && (a = b);
}
int inc(const int &a, const int &b)
{
return a + b >= MOD ? a + b - MOD : a + b;
}
int dec(const int &a, const int &b)
{
return a - b < 0 ? a - b + MOD : a - b;
}
int mul(const int &a, const int &b)
{
return 1LL * a * b % MOD;
}
void Inc(int &a, const int &b)
{
((a += b) >= MOD) && (a -= MOD);
}
void Dec(int &a, const int &b)
{
((a -= b) < 0) && (a += MOD);
}
void Mul(int &a, const int &b)
{
a = 1LL * a * b % MOD;
}
void Sqr(int &a)
{
a = 1LL * a * a % MOD;
}
int qwqmi(int x, int k = MOD - 2)
{
int res = 1;
while(k)
{
if(k & 1) Mul(res, x);
Sqr(x), k >>= 1;
}
return res;
}
const int N = 5e3 + 5;
int n, m, ans;
int qwq[N][N];
int sum[N][N];
void preprocess()
{
qwq[0][0] = 1;
for(int i = 1; i < N; ++i)
{
qwq[i][0] = 1;
sum[i][0] = 0;
for(int j = 1; j < N; ++j)
{
qwq[i][j] = mul(qwq[i][j - 1], i);
sum[i][j] = sum[i][j - 1];
Mul(sum[i][j], m);
Inc(sum[i][j], qwq[i][j]);
}
}
}
int main()
{
scanf("%d %d", &n, &m);
preprocess();
ans = qwq[m][n];
for(int i = 2; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
{
int w = qwq[m - 1][i - 1];
Inc(w, dec(sum[m - 1][i - 2], sum[m - j][i - 2]));
Mul(w, qwq[m][n - i]);
Inc(ans, w);
}
}
printf("%d\n", ans);
return 0;
}