#include<bits/stdc++.h> 
using namespace std; 
#define x first
#define y second
#define forn(i, n) for(int i = 0; i < int(n); ++i)
typedef pair<int, int> pii;
const int MAXN = 200000+14;
long long factorial[MAXN+1];
long long invs[MAXN+1];
long long factorial_inv[MAXN+1];
const long long  mod = 998244353;
long long max(long long a,long long b){
	if(a>b)
		return a;
	return b;
}
vector<long long> trial_division1(long long n) {
    vector<long long> factorization;
    for (long long d = 2; d * d <= n; d++) {
    	if(n%d == 0)
    		factorization.push_back(d);
        while (n % d == 0) {
            
            n /= d;
        }
    }
    if (n > 1)
        factorization.push_back(n);
    return factorization;
}

long long modu(long long p){
		return ((p%mod)+mod)%mod;
}
int modu(int p){
	return ((p%mod)+mod)%mod;
}
long long gcdExtended(long long a, long long b, long long &x, long long &y); 

	//Function to find modulo inverse of a 
long long modInverse(long long a) 
{ 
	    long long x, y; 
	    long long g = gcdExtended(a, mod, x, y); 
	    if (g != 1) 
	        return 1; 
	    else
	    { 
	        // m is added to handle negative x 
	        int res = (x%mod + mod) % mod; 
	        return  res; 
	    } 
} 
	  
	// C function for extended Euclidean Algorithm 
long long gcdExtended(long long a, long long b, long long &x, long long &y) 
{ 
	    // Base Case 
	    if (a == 0) 
	    { 
	        x = 0, y = 1; 
	        return (long long) b; 
	    } 
	  
	    long long x1, y1; // To store results of recursive call 
	    long long gcd = gcdExtended(b%a, a, x1, y1); 
	  
	    // Update x and y using results of recursive 
	    // call 
	    x = y1 -  x1*(b/a); 
	    y = x1; 
	  
	    return gcd; 
	} 
//generates any solution to ax+by = c;
long long diophantine(int a,int b,int c, long long &x,long long &y){
	long long gcd = gcdExtended(abs(a),abs(b),x,y);
	long long d = (long long) c;
	if(d%gcd == 0){
		x = (x)*(d/gcd);
		y = (y)*(d/gcd);
		if (a < 0) x = -x;
        if (b < 0) y = -y;
		return gcd;
	}
	return 0;
}
pair<long long,long long> min_dioph(int a,int b,int c){
	long long x;long long y;
	long long gcd = diophantine(a,-b,c,x,y);
	if(gcd){
		if(x>=0 && y>=0){
			long long  ma =  a/gcd;
			long long  mb =  b/gcd;
			long long t = min(x/mb,y/ma);
			return make_pair(x -(mb*t),y-(ma*t));
		}
		else if(x>=0){
			long long  ma =  a/gcd;
			long long  mb =  b/gcd;
			long long t;
			((-y)%ma ==0)? t = (-y)/ma: t = ((-y)/ma)+1;
			return make_pair(x +(mb*t),y+(ma*t));
		}
		else if(y>=0){
			long long  ma =  a/gcd;
			long long  mb =  b/gcd;
			long long t;
			((-x)%mb ==0)? t = (-x)/mb: t = ((-x)/mb)+1;
			return make_pair(x +(mb*t),y+(ma*t));
		}
		else{
			long long  ma =  a/gcd;
			long long  mb =  b/gcd;
			long long t1,t2 ;
			((-x)%mb ==0)? t1 = (-x)/mb: t1 = ((-x)/mb)+1;
			((-y)%ma ==0)? t2 = (-y)/ma: t2 = ((-y)/ma)+1;
			long long t = max(t1,t2);
			return make_pair(x +(mb*t),y + (ma*t));
		}
	}
	else{
		return make_pair(-1,-1);
	}
}

void create_fact(int x){
		factorial[0] = 1;
		for(int j=1;j<=x;j++){
			factorial[j] = modu(factorial[j-1]*j);
		}
}
void num_inv(int x){
	invs[1] = 1;
	for(int j=2;j<=x;j++){
		invs[j] =modu(invs[mod % j]*(mod - mod / j) );
	}
}
void create_fact_inv(int x){
	    num_inv(x);
		factorial_inv[0] = 1;
		factorial_inv[1] = 1;
		for(int j=2;j<=x;j++){
			factorial_inv[j] =modu( factorial_inv[j-1]*invs[j] );
		}
}
long long ncr(int p,int q){
		return (((factorial[p]*factorial_inv[q])%mod)*factorial_inv[p-q])%mod;
}
//void create_fact(int x)
//void create_fact_inv(int x)
//long long ncr(int p, int q)
//long long modInverse(long long x);
//long long diophantine(int a,int b,int c, long long x,long long y) pointers x , y will contain a solution to the diophantine eqaution ax+by= c if solvable. Function will return gcd(a,b)
//pair<long long,long long> min_dioph(int a,int b,int c) will return the minimal solution to ax-by = c where a>=0 and b>=0 minimal soltuion is the solution with minimal x,y such that x>=0 and y>=0
//vector<long long> trial_division1(long long n) returns a vector of the prime factors of n
int N,M,K;
vector<long long> powe(MAXN,0);
void solve(){
	cin>>N>>M>>K;
	
	powe[0] = 1;
	for(int i = 1;i<N+2;i++){
		powe[i] = modu(powe[i-1]*(M-1));
	}
	create_fact(N+2);
	create_fact_inv(N+2);
	//cout<<factorial[3]<<" "<<factorial_inv[3]<<endl;
	long long suma = 0;
	forn(i,K+1){
		long long ans = 1;
		ans = modu(ans * M);
		ans = modu(ans*ncr(N-1,i));
		ans = modu(ans*(powe[N-1-i]));
		suma = modu(suma+ans);
	}
	cout<<suma<<endl;
	
	
}
int main(){
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	
	solve();
	
	return 0;	
}

Measured memory_bytes: 9536