#include <bits/stdc++.h>
using namespace std;
template <int MOD>
struct Modular {
  int value;
  Modular(const Modular& k) : value(k.value) {}
  template <typename V>
  Modular(const V& v) : value(v % MOD) {
    if (value < 0) {
      value += MOD;
    }
  }
  Modular() : Modular(0) {}
  Modular& operator+=(Modular const& b) {
    value += b.value;
    if (value >= MOD) value -= MOD;
    return *this;
  }
  Modular& operator-=(Modular const& b) {
    value -= b.value;
    if (value < 0) value += MOD;
    return *this;
  }
  Modular& operator*=(Modular const& b) {
    value = (long long)value * b.value % MOD;
    return *this;
  }
  Modular& operator++() { return *this += 1; }
  Modular& operator--() { return *this -= 1; }
  Modular operator++(int) { return *this += 1; }
  Modular operator--(int) { return *this -= 1; }
  friend Modular inverse(Modular a) { return mexp(a, MOD - 2); }
  Modular& operator/=(Modular const& b) { return *this *= inverse(b); }
  friend Modular operator+(Modular a, Modular const b) { return a += b; }
  friend Modular operator-(Modular a, Modular const b) { return a -= b; }
  friend Modular operator-(Modular const a) { return 0 - a; }
  friend Modular operator*(Modular a, Modular const b) { return a *= b; }
  friend Modular operator/(Modular a, Modular const b) { return a /= b; }
  friend std::ostream& operator<<(std::ostream& os, Modular const& a) {
    return os << a.value;
  }
  friend bool operator==(Modular const& a, Modular const& b) {
    return a.value == b.value;
  }
  friend bool operator!=(Modular const& a, Modular const& b) {
    return a.value != b.value;
  }
};
template <int T, typename V>
Modular<T> mexp(Modular<T> a, V e) {
  if (a == 0) return e == 0 ? 1 : 0;
  Modular<T> res = 1;
  while (e) {
    if (e & 1) res *= a;
    a *= a;
    e >>= 1;
  }
  return res;
}
using Mint = Modular<998244353>;
int main() {
  int n, m, k;
  cin >> m >> n >> k;
  vector<Mint> dp(k + 1, 0);
  vector<Mint> pw_inv(k + 1, 1);
  vector<Mint> pw_m(k + 1, 1);
  vector<vector<Mint> > choose(k + 1, vector<Mint>(k + 1));
  vector<Mint> m_choose(k + 1);
  choose[0][0] = 1;
  for (int i = 1; i <= k; ++i) {
    choose[i][0] = 1;
    choose[0][i] = 0;
  }
  for (int i = 1; i <= k; ++i) {
    for (int j = 1; j <= i; ++j) {
      choose[i][j] = choose[i - 1][j] + choose[i - 1][j - 1];
    }
  }
  m_choose[0] = 1;
  for (int i = 1; i <= min(k, m); ++i) {
    m_choose[i] = m_choose[i - 1] * Mint(m - i + 1) / i;
  }
  Mint inv = inverse(Mint(n));
  for (int i = 1; i <= k; ++i) {
    pw_inv[i] = inv * pw_inv[i - 1];
    pw_m[i] = m * pw_m[i - 1];
  }
  dp[1] = 1;
  for (int i = 2; i <= k; ++i) {
    dp[i] = mexp(Mint(i), k);
    for (int j = 1; j < i; ++j) {
      dp[i] -= dp[j] * choose[i][j];
    }
  }
  Mint ans = 0;
  for (int j = 1; j <= min(k, m); ++j) {
    ans += m_choose[j] * dp[j] * pw_inv[j];
  }
  cout << ans << "\n";
  return 0;
}
