#include <bits/stdc++.h>
using namespace std;
long long mod = 998244353;
long long binpow(long long a, long long p) {
  return p ? binpow(a * a % mod, p >> 1) * (p & 1 ? a : 1) % mod : 1;
}
long long bininv(long long a) { return binpow(a, mod - 2); }
set<int> solved;
map<long long, vector<long long> > mp;
vector<vector<long long> > C;
int k, kk;
long long m, invm;
long long fact[35000];
long long ifact[35000];
struct FFT {
  int n;
  vector<long long> w;
  vector<long long> inv;
  void set(int _n = (1 << 14)) {
    n = _n;
    inv.resize(n);
    inv[0] = 0;
    for (int i = 1, j = 0; i < n; i++) {
      int bit = (n >> 1);
      while (bit & j) {
        j ^= bit;
        bit >>= 1;
      }
      j ^= bit;
      inv[i] = j;
    }
    w.resize(n);
    long long step = binpow(3, (mod - 1) / n);
    w[0] = 1;
    for (int i = 1; i < n; i++) {
      w[i] = w[i - 1] * step % mod;
    }
  }
  void fft(vector<long long>& a) {
    for (int i = 0; i < n; i++) {
      if (i < inv[i]) {
        swap(a[i], a[inv[i]]);
      }
    }
    for (int len = 2; len <= n; len <<= 1) {
      for (int i = 0; i < n; i += len) {
        int i1 = i, i2 = i + (len >> 1);
        int wind = 0, wstep = (n / len);
        for (; i2 < i + len; i1++, i2++, wind += wstep) {
          long long x = a[i1], y = a[i2] * w[wind] % mod;
          a[i1] = (x + y) % mod;
          a[i2] = (x - y + mod) % mod;
        }
      }
    }
  }
  void ifft(vector<long long>& a) {
    fft(a);
    reverse(a.begin() + 1, a.end());
    long long invn = binpow(n, mod - 2);
    for (int i = 0; i < n; i++) {
      a[i] = (a[i] * invn) % mod;
    }
  }
  void do_calculation(vector<long long> a, vector<long long> b,
                      vector<long long>& to) {
    fft(a);
    fft(b);
    for (int i = 0; i < n; i++) {
      to[i] = a[i] * b[i] % mod;
    }
    ifft(to);
    for (int i = k + 1; i < n; i++) {
      to[i] = 0;
    }
  }
} fft;
void prec() {
  fact[0] = ifact[0] = 1;
  for (int i = 1; i < 35000; i++) {
    fact[i] = fact[i - 1] * i % mod;
    ifact[i] = binpow(fact[i], mod - 2);
  }
}
void calc(long long n) {
  if (solved.count(n)) return;
  if (n == 1) {
    vector<long long> tmp(k + 1, invm);
    tmp[0] = 1;
    for (int i = 0; i < k + 1; i++) {
      tmp[i] = tmp[i] * ifact[i] % mod;
    }
    while (tmp.size() < kk) {
      tmp.push_back(0);
    }
    mp[1] = tmp;
  } else if (n & 1) {
    calc(n - 1);
    mp[n] = vector<long long>(kk, 0);
    fft.do_calculation(mp[1], mp[n - 1], mp[n]);
    mp[n][0] = 1;
  } else {
    calc(n / 2);
    mp[n] = vector<long long>(kk, 0);
    fft.do_calculation(mp[n / 2], mp[n / 2], mp[n]);
    mp[n][0] = 1;
  }
  solved.insert(n);
}
void solve(int test_ind) {
  int st = clock();
  prec();
  long long n;
  cin >> n >> m >> k;
  kk = 1;
  while (kk < k) {
    kk <<= 1;
  }
  kk <<= 1;
  fft.set(kk);
  invm = bininv(m);
  calc(n);
  cout << mp[n][k] * fact[k] % mod << endl;
}
int main() {
  int t = 1;
  for (int i = 0; i < t; i++) {
    solve(i);
  }
  return 0;
}
