#include<bits/stdc++.h>
using namespace std;
int mod = 998244353;
int add(int a, int b){
int ans = a + b;
while(ans >= mod){
ans -= mod;
}
return ans;
}
void add_self(int & a, int b){
a = add(a,b);
}
int sub(int a, int b){
int ans = a - b;
while(ans < 0){
ans += mod;
}
return ans;
}
void sub_self(int & a, int b){
a = sub(a,b);
}
int mul(int a, int b){
int ans = ((int64_t)a * b) % mod;
return ans;
}
int binexpo(int b, int e){
int ans = 1;
while(e){
if(e & 1){
ans = mul(ans,b);
}
b = mul(b,b);
e >>= 1;
}
return ans;
}
int pw[5003][5003];
int dp[5005][3];
constexpr inline void init(){
for(int i = 1; i < 5001; ++i){
for(int j = 0; j < 5001; ++j){
if(j == 0){
pw[i][j] = 1;
}
else{
pw[i][j] = mul(pw[i][j-1],i);
}
}
}
}
int main(){
init();
int n,m;
cin >> n >> m;
int ans = 0;
for(int len = 1; len <= n; ++len){
int outside_range_0 = pw[m][max(0,n-len-2)];
int outside_range_1 = pw[m][max(0,n-len-1)];
for(int k = 1; k <= m; ++k){
int inside_range = sub(pw[m-k+1][len], pw[m-k][len]);
int outside_range = 1;
//for those not connected to the edge
int km1 = k-1;
int km1s = mul(km1,km1);
add_self(dp[len][0],mul(km1s,inside_range));
//connected to one end
add_self(dp[len][1],mul(km1,inside_range));
//connected to both ends
if(len == n){
add_self(dp[len][2],inside_range);
}
}
dp[len][0] = mul(dp[len][0],outside_range_0);
dp[len][1] = mul(dp[len][1],outside_range_1);
}
//return 0;
for(int i = 0; i < n; ++i){
for(int j = i; j < n; ++j){
if(i == 0 && j == n-1){
add_self(ans,dp[j-i+1][2]);
}
else if(i == 0 || j == n-1){
add_self(ans,dp[j-i+1][1]);
}
else{
add_self(ans,dp[j-i+1][0]);
}
}
}
cout << ans << "\n";
return 0;
}