#include <bits/stdc++.h>
using namespace std;
const int P = 998244353;
void add(int &a, int b) {
  a += b;
  if (a >= P) a -= P;
}
void sub(int &a, int b) {
  a -= b;
  if (a < 0) a += P;
}
int mul(int a, int b) { return 1LL * a * b % P; }
int pw(int a, int b) {
  if (b == 0) return 1;
  int res = pw(a, b / 2);
  if (b & 1) return mul(mul(res, res), a);
  return mul(res, res);
}
int inv(int a) {
  assert(a);
  return pw(a, P - 2);
}
struct epoly {
  vector<int> coef;
  epoly() { this->coef = vector<int>(); }
  epoly(int c) {
    this->coef = vector<int>();
    this->coef.push_back(c);
  }
  epoly(vector<int> &v) { this->coef = v; }
  epoly operator*(const int &c) const {
    epoly res;
    for (int i = 0; i < coef.size(); i++) {
      res.coef.push_back(mul(c, coef[i]));
    }
    return res;
  }
  epoly operator*(const epoly &e) const {
    epoly res;
    res.coef.resize(coef.size() + e.coef.size() - 1);
    for (int i = 0; i < coef.size(); i++) {
      for (int j = 0; j < e.coef.size(); j++) {
        add(res.coef[i + j], mul(coef[i], e.coef[j]));
      }
    }
    return res;
  }
  epoly der() const {
    epoly res;
    for (int i = 0; i < coef.size(); i++) {
      res.coef.push_back(mul(i, coef[i]));
    }
    return res;
  }
  epoly operator+(const epoly &ep) const {
    epoly res;
    for (int i = 0; i < max(coef.size(), ep.coef.size()); i++) {
      int c = 0;
      if (i < coef.size()) add(c, coef[i]);
      if (i < ep.coef.size()) add(c, ep.coef[i]);
      res.coef.push_back(c);
    }
    return res;
  }
};
struct mgf {
  epoly lp;
  epoly rp;
  int ns;
  mgf() : lp(), rp(), ns() {}
  mgf der() const {
    mgf m;
    m.lp = lp.der() * rp + lp * ns * rp.der();
    m.rp = rp;
    m.ns = ns - 1;
    return m;
  }
  int zero() const {
    int res_l = 0, res_r = 0;
    for (auto &c : lp.coef) {
      add(res_l, c);
    }
    for (auto &c : rp.coef) {
      add(res_r, c);
    }
    res_r = pw(res_r, ns);
    return mul(res_l, res_r);
  }
};
int main() {
  int n, m, k;
  cin >> n >> m >> k;
  int p = inv(m);
  int q = 1;
  sub(q, p);
  mgf f;
  f.lp = epoly(1);
  vector<int> tmp = {q, p};
  f.rp = epoly(tmp);
  f.ns = n;
  for (int i = 0; i < k; i++) {
    f = f.der();
  }
  cout << f.zero() << '\n';
  return 0;
}
