#include <bits/stdc++.h>
using namespace std;
template <typename T>
bool chmin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}
template <typename T>
bool chmax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}
const long long P = 998244353;
const int maxK = 5000 + 5;
long long qpow(long long a, long long b) {
  long long r = 1;
  while (b) {
    if (b & 1) (r *= a) %= P;
    (a *= a) %= P;
    b >>= 1;
  }
  return r;
}
long long n, m;
int k;
long long fac[maxK], ifac[maxK];
long long C(int n, int k) {
  if (k < 0 || k > n)
    return 0;
  else
    return fac[n] * ifac[k] % P * ifac[n - k] % P;
}
long long falling(long long n, int k) {
  long long r = 1;
  while (k--) r = r * n % P, n--;
  return r;
}
long long S[2][maxK];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> k;
  long long im = qpow(m, P - 2);
  long long im1 = qpow(m - 1, P - 2);
  if (m == 1) {
    cout << qpow(n, k) << endl;
    return 0;
  }
  fac[0] = 1;
  for (int i = 1; i <= k; ++i) fac[i] = fac[i - 1] * i % P;
  ifac[k] = qpow(fac[k], P - 2);
  for (int i = k - 1; i >= 0; --i) ifac[i] = ifac[i + 1] * (i + 1) % P;
  memset(S, 0, sizeof(S));
  {
    for (int n = 1; n <= k; ++n) {
      S[n & 1][1] = 1;
      for (int i = 2; i <= n; ++i) {
        S[n & 1][i] = (S[(n - 1) & 1][i - 1] + S[(n - 1) & 1][i] * i) % P;
      }
    }
  }
  long long ans = 0;
  long long falling = 1;
  for (int j = 1; j <= k && j <= n; ++j) {
    falling = falling * (n - j + 1) % P;
    (ans += S[k & 1][j] * falling % P * qpow(1 - im, n) % P * qpow(im1, j) % P *
            qpow(im1 + 1, n - j)) %= P;
  }
  cout << ((ans % P + P) % P) << endl;
  return 0;
}
