#include <bits/stdc++.h>
using namespace std;
//using Graph = vector<vector<int>>;
using P = pair<int,int>;
//int dy[4] = {-1,0,1,0};
//int dx[4] = {0,-1,0,1};
//long long  MOD  = 998244353;

/*
using ipair = std::pair<int,int>;//いちいちpair<int,int>と書くのが面倒なので
std::priority_queue<ipair, std::vector<ipair>, std::less<ipair>> que;
bool operator>(const ipair a,const ipair b){return a.first > b.first;};//演算子オーバーロード
int main()
{
    int N;
    cin >> N;
    
    
    vector<string> data(N);
    for(int i=0;i<N;i++)
    {
        cin >> data[i];
    }
    
    priority_queue<ipair, std::vector<ipair>, std::less<ipair>>  cost;
    priority_queue<ipair, std::vector<ipair>, std::less<ipair>>  plus;
    priority_queue<ipair, std::vector<ipair>, std::less<ipair>>  minus;
    for(int i=0;i<N;i++)
    {
        int temp = 0;
        int rett = 0;
        for(int j=0;j<(int)data[i].size();j++)
        {
            if(data[i][j] == '(')
            {
                temp ++;
            }
            else
            {
                temp--;
            }
            
            rett = min(temp,rett);
        }
        if(rett == 0)
        {
            plus.push(make_pair(temp,rett));
        }
        else if(temp > 0)
        {
            cost.push(make_pair(temp,rett));
        }
        else
        {
            minus.push(make_pair(temp,rett));
        }
        
    }
    
    int ans = 0;
    bool ok = true;
    queue<ipair> ttttt;
    while(!plus.empty())
    {
        pair<int,int> p = plus.top();
        plus.pop();
        ans += p.second;
    }
    while(!cost.empty())
    {
        pair<int,int> p = cost.top();
        cost.pop();
        
        if(ans + p.first < 0)
        {
            ok = false;
            break;
        }
        ans += p.second;
    }
    while(!minus.empty())
    {
        pair<int,int> p = minus.top();
        minus.pop();
        
        if(ans + p.first < 0)
        {
            ok = false;
            break;
        }
        ans += p.second;
    }

    
    if(ans != 0)
    {
        ok = false;
    }
    
    if(ok)
    {
        cout << "Yes" << endl;
    }
    else
    {
        cout << "No" << endl;
    }
    
}
*/
typedef long long ll;

const ll MOD = 998244353;

vector<ll> fac(300001); //n!(mod M)
vector<ll> ifac(300001); //k!^{M-2} (mod M)
//a,bの範囲的にこれだけ配列を用意していけば十分

ll mpow(ll x, ll n){ //x^n(mod M) ←普通にpow(x,n)では溢れてしまうため，随時mod計算
    ll ans = 1;
    while(n != 0){
        if(n&1) ans = ans*x % MOD;
        x = x*x % MOD;
        n = n >> 1;
    }
    return ans;
}

ll comb(ll a, ll b){ //aCbをmod計算
    if(a == 0 && b == 0)return 1;
    if(a < b || a < 0)return 0;
    ll tmp = ifac[a-b]* ifac[b] % MOD;
    return tmp * fac[a] % MOD;
}



long long mod(long long x)
{
    return x % MOD;
}



int main()
{
    ll N,M,K;
    cin >> N >> M >> K;
    
    /*
    vector<vector<long long>> data(N,vector<long long>(K,0));
    
    data[0][0] = 1;
    
    for(int i=1;i<N;i++)
    {
        data[i][0] =mod( data[i-1][0] * (M-1));
        for(int j=1;j<K;j++)
        {
            if(data[i-1][j-1] == 0) break;
            data[i][j] = mod(data[i-1][j-1] + data[i-1][j] * (M-1));
        }
    }
    */
    long long ans = 0;
    fac[0] = 1;
    ifac[0] = 1;
    for(ll i = 0; i<300000; i++){
        fac[i+1] = fac[i]*(i+1) % MOD; // n!(mod M)
        ifac[i+1] = ifac[i]*mpow(i+1, MOD-2) % MOD; // k!^{M-2} (mod M) ←累乗にmpowを採用
    }
    for(ll i=0;i<K+1;i++)
    {
        //ans = mod(ans + data[N-1][i]);
        
        
        
        
        ans = mod(ans + (comb(N-1,i)%MOD) * (mpow(M-1,N-1-i) % MOD));
    }
    /*
    for(int i=1;i<M;i++)
    {
        ans = (ans * (i+1)) % MOD;
    }
    
    */
    
    cout << ans * M % MOD << endl;
    
    return 0;
}

/*
int main()
{
    int N;
    cin >> N;
    
 
 int ans;
 cout << ans << endl;
    return 0;
}
*/

Measured memory_bytes: 7828