mod = 998244353 #出力の制限

N = 2 * (10**5)

g1 = [1, 1] # 元テーブル

g2 = [1, 1] #逆元テーブル

inverse = [0, 1] #逆元テーブル計算用テーブル



for i in range( 2, N + 1 ):

    g1.append( ( g1[-1] * i ) % mod )

    inverse.append( ( -inverse[mod % i] * (mod//i) ) % mod )

    g2.append( (g2[-1] * inverse[-1]) % mod )



def nCr(n, r, mod):

    if ( r<0 or r>n ):

        return 0

    r = min(r, n-r)

    return g1[n] * g2[r] * g2[n-r] % mod



def nPr(n, r, mod):

    if ( r<0 or r>n ):

        return 0

    r = min(r, n-r)

    return g1[n] * g2[n-r] % mod



def main():

    N, M, K = list(map(int, input().split()))



    ans = 0

    for i in range(0, K + 1):

        # N-i個のボールを隣り合う色が必ず異なるようにする並べ方

        # 最初はM通り、それ以降は前の色とは違うM-1通り

        # = M * (M - 1) * (M - 1) * ... = M * (M - 1)^(N - i - 1)

        base = M * pow(M - 1, N - i - 1, mod)

        # 同じ色のボールを追加する場所をi箇所選ぶ

        # = 最初以外の N - 1箇所から、「前の色と同じ」を設定する場所をi箇所選ぶ

        # = nCr(N - 1, i)

        patterns = base * nCr(N - 1, i, mod)

        # print(i, base, nCr(N - 1, i, mod), patterns)

        

        ans = (ans + patterns) % mod

    

    print(ans)



if __name__ == '__main__':

    main()


class ModCombination():

    def __init__(self, n, mod=998244353):

        self.mod = mod

        self.N = n

        fact = [1, 1] # 元テーブル

        ifact = [1, 1] #逆元テーブル

        inverse = [0, 1] #逆元テーブル計算用テーブル



        for i in range( 2, n + 1 ):

            fact.append( ( fact[-1] * i ) % mod )

            inverse.append( ( -inverse[mod % i] * (mod//i) ) % mod )

            ifact.append( (ifact[-1] * inverse[-1]) % mod )

        

        self.fact = fact

        self.ifact = ifact

        self.inverse = inverse



    def nCr(self, n, r):

        if r < 0 or r > n:

            return 0

        return self.fact[n] * self.ifact[r] * self.ifact[n-r] % self.mod



    def nPr(self, n, r):

        if r < 0 or r > n:

            return 0

        return self.fact[n] * self.ifact[n-r] % self.mod



def main():

    N, M, K = list(map(int, input().split()))

    MOD = 998244353

    mc = ModCombination(N, MOD)



    ans = 0

    for i in range(0, K + 1):

        # N-i個のボールを隣り合う色が必ず異なるようにする並べ方

        # 最初はM通り、それ以降は前の色とは違うM-1通り

        # = M * (M - 1) * (M - 1) * ... = M * (M - 1)^(N - i - 1)

        base = M * pow(M - 1, N - i - 1, MOD)

        # 同じ色のボールを追加する場所をi箇所選ぶ

        # = 最初以外の N - 1箇所から、「前の色と同じ」を設定する場所をi箇所選ぶ

        # = nCr(N - 1, i)

        patterns = base * mc.nCr(N - 1, i)

        # print(i, base, mc.nCr(N - 1, i, mod), patterns)

        

        ans = (ans + patterns) % MOD

    

    print(ans)



if __name__ == '__main__':

    main()
mod = 998244353  # 出力の制限
N = 2 * (10**5)
g1 = [1, 1]  # 元テーブル
g2 = [1, 1]  # 逆元テーブル
inverse = [0, 1]  # 逆元テーブル計算用テーブル
for i in range(2, N + 1):
    g1.append((g1[-1] * i) % mod)
    inverse.append((-inverse[mod % i] * (mod // i)) % mod)
    g2.append((g2[-1] * inverse[-1]) % mod)


def nCr(n, r, mod):
    if r < 0 or r > n:
        return 0
    r = min(r, n - r)
    return g1[n] * g2[r] * g2[n - r] % mod


def nPr(n, r, mod):
    if r < 0 or r > n:
        return 0
    r = min(r, n - r)
    return g1[n] * g2[n - r] % mod


def main():
    N, M, K = list(map(int, input().split()))
    ans = 0
    for i in range(0, K + 1):
        # N-i個のボールを隣り合う色が必ず異なるようにする並べ方
        # 最初はM通り、それ以降は前の色とは違うM-1通り
        # = M * (M - 1) * (M - 1) * ... = M * (M - 1)^(N - i - 1)
        base = M * pow(M - 1, N - i - 1, mod)
        # 同じ色のボールを追加する場所をi箇所選ぶ
        # = 最初以外の N - 1箇所から、「前の色と同じ」を設定する場所をi箇所選ぶ
        # = nCr(N - 1, i)
        patterns = base * nCr(N - 1, i, mod)
        # print(i, base, nCr(N - 1, i, mod), patterns)
        ans = (ans + patterns) % mod
    print(ans)


if __name__ == "__main__":
    main()

class ModCombination:
    def __init__(self, n, mod=998244353):
        self.mod = mod
        self.N = n
        fact = [1, 1]  # 元テーブル
        ifact = [1, 1]  # 逆元テーブル
        inverse = [0, 1]  # 逆元テーブル計算用テーブル
        for i in range(2, n + 1):
            fact.append((fact[-1] * i) % mod)
            inverse.append((-inverse[mod % i] * (mod // i)) % mod)
            ifact.append((ifact[-1] * inverse[-1]) % mod)
        self.fact = fact
        self.ifact = ifact
        self.inverse = inverse

    def nCr(self, n, r):
        if r < 0 or r > n:
            return 0
        return self.fact[n] * self.ifact[r] * self.ifact[n - r] % self.mod

    def nPr(self, n, r):
        if r < 0 or r > n:
            return 0
        return self.fact[n] * self.ifact[n - r] % self.mod


def main():
    N, M, K = list(map(int, input().split()))
    MOD = 998244353
    mc = ModCombination(N, MOD)
    ans = 0
    for i in range(0, K + 1):
        # N-i個のボールを隣り合う色が必ず異なるようにする並べ方
        # 最初はM通り、それ以降は前の色とは違うM-1通り
        # = M * (M - 1) * (M - 1) * ... = M * (M - 1)^(N - i - 1)
        base = M * pow(M - 1, N - i - 1, MOD)
        # 同じ色のボールを追加する場所をi箇所選ぶ
        # = 最初以外の N - 1箇所から、「前の色と同じ」を設定する場所をi箇所選ぶ
        # = nCr(N - 1, i)
        patterns = base * mc.nCr(N - 1, i)
        # print(i, base, mc.nCr(N - 1, i, mod), patterns)
        ans = (ans + patterns) % MOD
    print(ans)


if __name__ == "__main__":
    main()

-mod = 998244353  # 出力の制限 -N = 2 * (10**5) -g1 = [1, 1]  # 元テーブル -g2 = [1, 1]  # 逆元テーブル -inverse = [0, 1]  # 逆元テーブル計算用テーブル -for i in range(2, N + 1): -    g1.append((g1[-1] * i) % mod) -    inverse.append((-inverse[mod % i] * (mod // i)) % mod) -    g2.append((g2[-1] * inverse[-1]) % mod) +class ModCombination: +    def __init__(self, n, mod=998244353): +        self.mod = mod +        self.N = n +        fact = [1, 1]  # 元テーブル +        ifact = [1, 1]  # 逆元テーブル +        inverse = [0, 1]  # 逆元テーブル計算用テーブル +        for i in range(2, n + 1): +            fact.append((fact[-1] * i) % mod) +            inverse.append((-inverse[mod % i] * (mod // i)) % mod) +            ifact.append((ifact[-1] * inverse[-1]) % mod) +        self.fact = fact +        self.ifact = ifact +        self.inverse = inverse +    def nCr(self, n, r): +        if r < 0 or r > n: +            return 0 +        return self.fact[n] * self.ifact[r] * self.ifact[n - r] % self.mod -def nCr(n, r, mod): -    if r < 0 or r > n: -        return 0 -    r = min(r, n - r) -    return g1[n] * g2[r] * g2[n - r] % mod - - -def nPr(n, r, mod): -    if r < 0 or r > n: -        return 0 -    r = min(r, n - r) -    return g1[n] * g2[n - r] % mod +    def nPr(self, n, r): +        if r < 0 or r > n: +            return 0 +        return self.fact[n] * self.ifact[n - r] % self.mod +    MOD = 998244353 +    mc = ModCombination(N, MOD) -        base = M * pow(M - 1, N - i - 1, mod) +        base = M * pow(M - 1, N - i - 1, MOD) -        patterns = base * nCr(N - 1, i, mod) -        # print(i, base, nCr(N - 1, i, mod), patterns) -        ans = (ans + patterns) % mod +        patterns = base * mc.nCr(N - 1, i) +        # print(i, base, mc.nCr(N - 1, i, mod), patterns) +        ans = (ans + patterns) % MOD