
#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = long double;
using pint = pair<int, int>;

template <class T>
using vec = vector<T>;
template <class T>
using vec2 = vector<vec<T>>;
template <class T>
using vec3 = vector<vec2<T>>;

constexpr int INF = numeric_limits<int>::max();
constexpr ll INFL = numeric_limits<ll>::max();
//constexpr ll MOD = 1000000007; // 10^9+7
constexpr ll MOD = 998244353;

#define rep(i, n) for (ll i = 0, i##_len = (n); i < i##_len; ++i)

template <class T>
bool chmax(T &a, const T b)
{
    if (a < b)
    {
        a = b;
        return true;
    }
    return false;
}
template <class T>
bool chmin(T &a, const T b)
{
    if (a > b)
    {
        a = b;
        return true;
    }
    return false;
}

vector<long long> fac, finv, inv;

// テーブルを作る前処理
void COMinit(int max)
{
    fac.resize(max);
    finv.resize(max);
    inv.resize(max);
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < max; i++)
    {
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}

// 二項係数計算
long long COM(int n, int k)
{
    if (n < k)
        return 0;
    if (n < 0 || k < 0)
        return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}

ll modpow(ll x, ll n, const ll &mod)
{
    ll ret = 1;
    while (n > 0)
    {
        if (n & 1)
        {
            (ret *= x) %= mod;
        }
        (x *= x) %= mod;
        n >>= 1;
    }
    return ret;
}

ll N, M, K;

ll solve()
{
    ll ret = 0;
    for (int k = 0; k <= K; ++k)
    {
        ll a = 1;
        a *= M;
        a %= MOD;
        a *= modpow(M - 1, N - 1 - k, MOD);
        a %= MOD;
        a *= COM(N - 1, k);
        a %= MOD;
        ret += a;
        ret %= MOD;
    }
    return ret;
}

int main()
{
    COMinit(2 * 100000);
    cin >> N >> M >> K;
    cout << solve() << endl;
    return 0;
}

#include <memory.h>

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <utility>
#include <vector>

using namespace std;

#define MOD 998244353
#define INIT -1

long long int fact[200010] = {};

long long int mypow(long long int x, long long int n)
{
   if (n == 0)
      return 1;
   long long int tmp = mypow(x, n / 2);
   long long int res = (tmp * tmp) % MOD;
   if (n % 2 == 1)
      res = (res * x) % MOD;
   return res;
}

long long int comb(int n, int r)
{
   long long int res = fact[n];
   res = (res * mypow(fact[r], MOD - 2)) % MOD;
   res = (res * mypow(fact[n - r], MOD - 2)) % MOD;
   return res;
}

int main()
{
   long long int n, m, k;
   cin >> n >> m >> k;

   fact[0] = 1;
   for (int i = 1; i <= n - 1; i++)
   {
      fact[i] = (fact[i - 1] * i) % MOD;
   }

   long long int ans = 0;
   for (int i = 0; i <= k; i++)
   {
      ans += (m * ((comb(n - 1, i) * mypow(m - 1, n - 1 - i)) % MOD)) % MOD;
      ans %= MOD;
   }
   cout << ans << endl;
}