#include <bits/stdc++.h>
using namespace std;

#define all(x) begin(x), end(x)
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;


const ll MOD = 998244353;
ll M = 1234567;
ll N = 1000;

vector<ll> facts(1234568, -1);
vector<ll> inv_facts(12345678, -1);

ll fact(ll n){
    return facts[n];
}

ll pow(ll n, ll p){
    if(p == 0) return 1;
    ll t = pow(n, p/2);
    t = (t * t) % MOD;
    if(p & 1LL) t = (t * n) % MOD;
    return t;
}

ll inv(ll n){
    return pow(n, MOD - 2);
}

ll choose(ll n, ll k){
    // ll t = (fact(k) * fact(n - k)) % MOD;
    ll t = (inv_facts[k] * inv_facts[n - k] % MOD);
    t = (fact(n) * t) % MOD;
    // cout << n << ", " << k << ", " << t << endl;
    return t;
}

ll G(ll n, ll k){
    ll t = (choose(n - 1, k) * pow(M, k)) % MOD;
    t = (t * fact(n - k - 1)) % MOD;
    return t;
}

ll F(ll n){
    ll acc = 0;
    for(ll m = 1; m <= n; m ++){
        for(ll k = 0; k <= m - 1; k ++){
            ll t = 0;
            if(n == m) t = G(m, k);
            // there are k bridges on m nodes, leaving m - k components. You need to put n - m garbage nodes in m - k gaps
            else t = (G(m, k) * choose(n - k - 1, m - k - 1)) % MOD;
            if(n > m) t = (t * pow(N + M + 1, n - m)) % MOD;
            acc = (acc + t) % MOD;
            // cout << m << ", " << k << ", " << t << endl; // m nonzero nodes, k bridges
        }
    }
    return acc;
}

int main () {
    std::ios_base::sync_with_stdio (false);
    cin.tie(NULL);


    cin >> N;
    cin >> M;
    // cin >> MOD;

    facts[0] = 1;
    inv_facts[0] = 1;
    for(int i = 1; i <= N; i ++){
        facts[i] = (facts[i - 1] * i) % MOD;
        inv_facts[i] = inv(facts[i]);
    }

    cout << F(N) << endl;
    
}