#pragma GCC optimize ("O3")

#include <bits/stdc++.h>
#define DEBUG true
#ifdef ONLINE_JUDGE
#undef DEBUG
#define DEBUG false
#endif 

using namespace std;

#define TRACE(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); cerr << endl;}

void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
	cerr << "[" << *it << " = " << a << "]";
	err(++it, args...);
}

#define MAXN ((ll)2e5+5)
#define MOD ((ll)998244353)
#define INF ((ll)1e9 + 9)
#define ll long long
#define _ << " " <<
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define LOG(x) if(DEBUG) cerr << x << endl;
#define pb push_back
#define all(x) x.begin(), x.end()
#define endl "\n"
#define pii pair<int,int>
#define mid ((l+r)/2)

ll n, m, k;
ll A = 0;
ll ans;

void mulself(ll& a, ll b)
{
	a *= b;
	a %= MOD;
}

ll fast(ll a,ll b)
{
	ll res=1;
	while(b)
	{
		if(b&1LL)
		{
			res*=a;
			res%=MOD;
		}
		b>>=1LL;
		a*=a;
		a%=MOD;
	}
	return res;
}

ll inv(ll x)
{
	return fast(x, MOD-2);
}

ll C(ll a, ll b)
{
	ll ret = 1;
	for (int i = 0; i < b; ++i)
 		mulself(ret, a-i);

 	for (int i = 2; i <= b; ++i)
 		mulself(ret, inv(i));

 	return ret;
}


signed main()
{
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin >> n >> m >> k;

	A = m * fast(m-1, n-k-1);
	A %= MOD;

	mulself(A, C(n-1, k));

	ans = (ans + A) % MOD;

	ll B = A;

	for (int i = k-1; i >= 0; --i)
	{
		mulself(B, m-1);
		mulself(B, i+1);
		mulself(B, inv(n-(i+1)));

		ans = (ans + B) % MOD;
	}

	cout << ans << endl;
}

/* stuff you should look for
	* ll overflow, array bounds
	* special cases (n=1?)
	* do smth instead of nothing and stay organized
	* WRITE STUFF DOWN
*/
#include<bits/stdc++.h>
#define FAST_IO ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define int long long int
#define mod 998244353
using namespace std;
int fact[200005];
int power(int a, int b)
{
    if(b==0)
        return 1;
    int t = power(a,b/2);
    t*=t;
    t%=mod;
    if(b&1)
        t*=a;
    return t%mod;
}

int ncr(int n, int r)
{
    if(r==0)
        return 1;
    int ans=1;
    ans*=fact[n];
    ans%=mod;
    ans*=power(fact[r],mod-2);
    ans%=mod;
     ans*=power(fact[n-r],mod-2);
    ans%=mod;

    return ans;
}

void solve()
{
    fact[1]=1;
    fact[0]=1;
    for(int i=2;i<200005;i++)
        fact[i]=fact[i-1]*i%mod;
    int n,m,k;
    cin>>n>>m>>k;
    if(m==1)
    {
        if(k==n-1)
            cout<<1<<endl;
        else
            cout<<0<<endl;
        return;
    }
    int ans=0;
    for(int i=0;i<=k;i++)
    {
        int g = ncr(n-1,i);
        // cout<<g<<endl;
        int t = (g*m%mod)*power(m-1,n-1-i)%mod;
        ans+=t;
        ans%=mod;

    }
    
    cout<<ans<<endl;



}
signed main()

{
    FAST_IO;
    int t = 1;

    // cin>>t;

    while(t--)
    {
        solve();
    }
    
    return 0;
}