#include <bits/stdc++.h>
#define ll long long
#define MODV 998244353
#define INF INT_MAX // 2147483647
#define INFLL LLONG_MAX // 9223372036854775807
#define EPS 1e-9
#define rep(i, n) for(ll i=0, i##_len=(ll)(n); i<i##_len; i++)
#define repf(i, n) for(ll i=1, i##_len=(ll)(n+1); i<i##_len; i++)
#define per(i, n) for(ll i=((ll)(n))-1; i>=0; i--)
#define perf(i, n) for(ll i=((ll)(n)); i>0; i--)
#define all(v) v.begin(), v.end()
#define endl "\n"
#define vi vector<ll>
#define vvi vector<vector<ll>>
#define Yes() cout << "Yes" << endl
#define YES() cout << "YES" << endl
#define No() cout << "No" << endl
#define NO() cout << "NO" << endl
#define Init() std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout<<fixed<<setprecision(15);
template<class T>bool chmax(T &a, const T &b){ if(a<b){ a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b){ if(b<a){ a=b; return 1; } return 0; }
using namespace std;

template<int MOD> struct Fp{
    long long val;
    constexpr Fp(long long v = 0) noexcept : val(v % MOD){ if(val<0) v += MOD; }
    constexpr int getmod(){ return MOD; }
    constexpr Fp operator - () const noexcept{ return val ? MOD - val : 0; }
    constexpr Fp operator + (const Fp& r) const noexcept{ return Fp(*this) += r; }
    constexpr Fp operator - (const Fp& r) const noexcept{ return Fp(*this) -= r; }
    constexpr Fp operator * (const Fp& r) const noexcept{ return Fp(*this) *= r; }
    constexpr Fp operator / (const Fp& r) const noexcept{ return Fp(*this) /= r; }
    constexpr Fp& operator += (const Fp& r) noexcept{ val += r.val; if(val>=MOD) val -= MOD; return *this; }
    constexpr Fp& operator -= (const Fp& r) noexcept{ val -= r.val; if(val<0) val += MOD; return *this; }
    constexpr Fp& operator *= (const Fp& r) noexcept{ val = val*r.val%MOD; return *this; }
    constexpr Fp& operator /= (const Fp& r) noexcept{
        long long a = r.val, b = MOD, u = 1, v = 0;
        while (b) { long long t = a/b; a -= t*b; swap(a, b); u -= t*v; swap(u, v); }
        val = val*u%MOD; if(val<0) val += MOD; return *this; }
    constexpr bool operator == (const Fp& r) const noexcept{ return this->val == r.val; }
    constexpr bool operator != (const Fp& r) const noexcept{ return this->val != r.val; }
    friend constexpr ostream& operator << (ostream &os, const Fp<MOD>& x) noexcept{ return os << x.val; }
    friend constexpr istream& operator >> (istream &is, Fp<MOD>& x) noexcept{ return is >> x.val; }
    friend constexpr Fp<MOD> modpow(const Fp<MOD> &a, long long n) noexcept{
        if (n == 0) return 1; auto t = modpow(a, n/2); t = t*t; if(n & 1) t = t*a; return t; }
};
const int MOD = MODV;
using mint = Fp<MOD>;

template<class T> struct BiCoef{
    vector<T> fact_, inv_, finv_;
    constexpr BiCoef(){}
    constexpr BiCoef(int n) noexcept : fact_(n, 1), inv_(n, 1), finv_(n, 1){ init(n); }
    constexpr void init(int n) noexcept{
        fact_.assign(n, 1), inv_.assign(n, 1), finv_.assign(n, 1);
        int MOD=fact_[0].getmod();
        for(int i=2; i<n; i++){ fact_[i]=fact_[i-1]*i; inv_[i]=-inv_[MOD%i]*(MOD/i); finv_[i]=finv_[i-1]*inv_[i]; }}
    constexpr T com(int n, int k) const noexcept{ if(n<k||n<0||k<0) return 0; return fact_[n]*finv_[k]*finv_[n-k]; }
    constexpr T fact(int n) const noexcept{ if(n<0) return 0; return fact_[n]; }
    constexpr T inv(int n) const noexcept{ if(n<0) return 0; return inv_[n]; }
    constexpr T finv(int n) const noexcept{ if(n<0) return 0; return finv_[n]; }
};

int main(){
    Init();
    ll n, m, k;
    mint ans = 0;
    BiCoef<mint> bc(200001);
    cin >> n >> m >> k;

    // 隣接ブロックがi個(i=0,1,...,k)で固定して計算
    mint m_1 = modpow((mint)(m-1), n-1-k);

    for(ll i=k; i>=0; i--){
        ans += ((mint)m * m_1 * bc.com(n-1, i));
        m_1 *= (mint)(m-1);
    }
    cout << ans << endl;
}

Measured memory_bytes: 7908