/*
No matter how long a night, dawn will always break.

Simular saying ... The darkest hour is just before the dawn.
 ***************************************   ************************8   **********************************
*/
#include <bits/stdc++.h>
using namespace std;
 
#include <ext/pb_ds/assoc_container.hpp> // Common file 
#include <ext/pb_ds/tree_policy.hpp> 
#include <functional> // for less 
using namespace __gnu_pbds; 
 
typedef tree<int, null_type, less<int>, rb_tree_tag, 
             tree_order_statistics_node_update> data_set; 
#define fbo find_by_order
#define ook order_of_key
 
 
 
 
#define int         long long
#define double      long double
#define pb          push_back
#define pf          push_front
#define pii         pair<int,int>
#define vi          vector<int>
#define vii         vector<pii>
#define piiii       pair<pii,pii>
#define viiii       vector<pair<pii,pii>>
#define mi          map<int,int>
#define mii         map<pii,int>
#define piii           pair<int,pair<int,int> >
#define all(a)      (a).begin(),(a).end()
#define rall(a)     (a).rbegin(),(a).rend()
#define x           first
#define y           second
#define sz(x)       (int)x.size()
#define endl        '\n'
#define hell        998244353 
#define PI          3.141592653589
#define bs(v,n)     binary_search(all((v)),(n))
#define lb(v,n)     lower_bound(all((v)),(n))
#define ub(v,n)     upper_bound(all((v)),(n))
#define fo(i,l,u)   for(i=l;i<u;i++)
#define rfo(i,l,u)  for(i=l;i>=u;i--)
#define allfo(s)    for(auto it=(s).begin();it!=(s).end();it++)
#define _init(b)     memset(b,-1,sizeof(b))
#define _init0(b)     memset(b,0,sizeof(b))
#define MOD         998244353 
#define ef else if
 
 
 
 
 
int gcd(int a, int b) {  if (a == 0)  return b; return gcd(b % a, a); }  
bool mod(double a,double b) {return a/b - floor(a/b);}
 
int occurs(vi v,int n){
auto it=lb(v,n);auto it1=ub(v,n);int x=it1-it;return x;}
 
int logb(int base, int x) {
    return (log(x) / log(base));
}
void set_max(int &mx,int x){if(mx==-1||mx<x)mx=x;}
 
 
bool prime(int x)
{
	for (int i = 2; i*i <= x; i++)
		if (x%i == 0)
			return 0;
	return 1;
}

 
int power(int x,  int y) 
{ 
     int p=MOD;
    int res = 1;      // Initialize result 
    x = x % p;  // Update x if it is more than or  
    while (y > 0) 
    { 
        if (y & 1) 
            res = (res*x) % p; 
        y = y>>1; // y = y/2 
        x = (x*x) % p;   
    } 
    return res; 
} 
 
int mod_inv(int a){
   if(a==0)return 1;
    int m=MOD;
    a=a%m;
    return power(a,m-2)%m;
}
  


int fact[1000005];
void count_fact(){
    int i,x=1;
    fact[0]=1;
    fo(i,1,1000005){
        
        x=(x*i)%MOD;
      //  cout<<x<<" ";
        fact[i]=x;
        
    }
}
 
int ncr(int n,int r){
	if(r==0)return 1;
    int a=fact[n],b=fact[r],c=fact[n-r];
    
    return (a*mod_inv(b*c))%MOD;
   
}
void pl(){int i;cout<<endl;fo(i,0,100)cout<<"-";cout<<endl;}
 
 
signed main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int i,j,x,n,m,k;
 	count_fact();
 	cin>>n>>m>>k;
 	int ans=0;
 	fo(i,0,k+1){
 		int a,b,c;
 		a=ncr(n-1,i);
 		b=power(m-1,n-i-1);
 		c=(((a*b)%MOD)*m)%MOD;
 		//cout<<a<<" "<<b<<" "<<c<<endl;
 		ans+=c;
 		ans%=MOD;
 	}
 	cout<<ans;


    
    
    return 0;
}

Measured memory_bytes: 11512