"use strict";
var input = require("fs").readFileSync("/dev/stdin", "utf8");
var cin = input.trim().split(/ |\n/), cid = 0;

var mod = 998244353;
// mod < 2**30, N,M <= 2* 200000 < 2**18
// mod * N < 2**48 < 2**53-1 = Number.MAX_SAFE_INTEGER
// 乗算 with mod
function mul() {
    for (var a = arguments, r = a[0], i = a.length; --i;) {
        r = (((r >> 16) * a[i]) % mod * 65536 + (r & 65535) * a[i]) % mod;
    }
    return r;
}
// 累乗 with mod
function pow(x, y) {
    if (y == 0) return 1;
    if (y == 1) return x;
    let t = pow(x, y >> 1);
    t = mul(t, t);
    if (y & 1) t = mul(t, x);
    //console.log({ x, y, t });
    return t;
}
// 逆元 1/x == x^(mod-2) // 互いに素な場合
function inv(x) {
    if (x == 1) return 1;
    return pow(x, mod - 2);
}
function main() {
    let N = +cin.shift();
    let M = +cin.shift();
    let K = +cin.shift();
    // ans = M * Sigma (C(N-1,K)*(M-1)^(N-K) ) % mod_base
    let y = Array(K + 1).fill(1);
    let z = Array(N).fill(1);
    for (let i = 0; i < K; i++) {
        // y[i + 1] = (y[i] * (N - i - 1) / (i + 1) ) % mod_base;
        //console.log("inv:", i + 1, "->", j);
        y[i + 1] = mul(y[i], N - i - 1, inv(i + 1));
    }
    for (let i = N - 2; i >= 0; i--) {
        //z[N-1]=1, z[N-2]=M-1, z[N-2]=(M-1)**2, ..., z[i]=(M-1)**(N-i), ..., z[0]=(M-1)**N
        z[i] = mul(z[i + 1], M - 1);
    }
    //console.log({ y, z });
    let ans = 0;
    for (let i = 0; i < K + 1; i++) {
        ans += mul(y[i], z[i]);
        ans = ans % mod;
    }
    ans = mul(M, ans);
    console.log(ans);
}
main();
