#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1.1e6 + 5;
const int inv2 = 499122177;
int wn[MAXN], wnn[MAXN], fac[MAXN], facn[MAXN], f[MAXN], g[MAXN];
int n, m, k, Inv[MAXN], rev[MAXN], a[MAXN], b[MAXN], e[MAXN], d[MAXN], c[MAXN],
    A[MAXN], B[MAXN], D[MAXN], G[MAXN], AA[MAXN], BB[MAXN], AAA[MAXN],
    BBB[MAXN], X[MAXN];
const int mod = 998244353;
long long Sc() {
  long long ret = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  for (; isdigit(ch); ch = getchar())
    ret = ret * 10 + ch - 48, ret = ret >= mod ? ret % mod : ret;
  return ret * f;
}
char buf[121], *p1 = buf, *p2 = buf;
inline int getc() {
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 121, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline int read() {
  int ret = 0, f = 0;
  char ch = getc();
  while (!isdigit(ch)) {
    if (ch == '-') f = 1;
    ch = getc();
  }
  while (isdigit(ch)) {
    ret = ret * 10 + ch - 48;
    ch = getc();
  }
  return f ? -ret : ret;
}
template <typename T>
inline void write(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) write(x / 10);
  putchar(x % 10 + '0');
}
int mul(int a, int b) { return 1ll * a * b % mod; }
int dec(int a, int b) { return a >= b ? a - b : a + mod - b; }
int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
long long qkpow(long long a, long long b, long long mod) {
  long long ans = 1, base = a;
  while (b) {
    if (b & 1) ans = mul(ans, base);
    base = mul(base, base);
    b >>= 1;
  }
  return ans;
}
void init() {
  Inv[1] = 1;
  for (int i = 2; i < MAXN; i++)
    Inv[i] = 1ll * (mod - mod / i) * Inv[mod % i] % mod;
  for (int i = 1; i < MAXN; i <<= 1)
    wn[i] = qkpow(3ll, (mod - 1) / (i << 1), mod),
    wnn[i] = qkpow(wn[i], mod - 2, mod);
}
void NTT(int *a, int type, int n) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int mid = 1; mid < n; mid <<= 1) {
    int Wn = wn[mid];
    if (type == -1) Wn = wnn[mid];
    for (int R = mid << 1, j = 0; j < n; j += R) {
      int w = 1;
      for (int k = 0; k < mid; k++, w = mul(w, Wn)) {
        int x = a[j + k], y = mul(w, a[j + mid + k]);
        a[j + k] = add(x, y);
        a[j + mid + k] = dec(x, y);
      }
    }
  }
  if (type == -1)
    for (int i = 0; i < n; i++) a[i] = mul(a[i], Inv[n]);
}
void Polyinv(int *a, int *b, int len) {
  if (len == 1) {
    b[0] = qkpow(a[0], mod - 2, mod);
    return;
  }
  Polyinv(a, b, (len + 1) >> 1);
  int l = 0, m = (len << 1), n = 1;
  for (; n <= m; n <<= 1, l++)
    ;
  for (int i = 0; i < n; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (int i = 0; i < len; i++) c[i] = a[i];
  for (int i = len; i < n; i++) c[i] = 0;
  NTT(c, 1, n), NTT(b, 1, n);
  for (int i = 0; i < n; i++) b[i] = mul(dec(2, mul(c[i], b[i])), b[i]);
  NTT(b, -1, n);
  for (int i = len; i < n; i++) b[i] = 0;
}
void Polydao(int *Aa, int *Bb, int len) {
  Bb[len - 1] = 0;
  for (int i = 1; i < len; i++) Bb[i - 1] = mul(i, Aa[i]);
}
void Polyjifen(int *Aa, int *Bb, int len) {
  Bb[0] = 0;
  for (int i = 1; i < len; i++) Bb[i] = mul(Inv[i], Aa[i - 1]);
}
void PolyIn(int *f, int *g, int n) {
  static int A[MAXN], B[MAXN];
  int l = 0, M = 2 * n, N = 1;
  for (; N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < N; i++) A[i] = B[i] = 0;
  Polydao(f, A, n);
  Polyinv(f, B, n);
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  NTT(A, 1, N), NTT(B, 1, N);
  for (int i = 0; i < N; i++) A[i] = mul(A[i], B[i]);
  NTT(A, -1, N);
  Polyjifen(A, g, n);
}
void PolyExp(int *f, int *g, int n) {
  if (n == 1) {
    g[0] = 1;
    return;
  }
  PolyExp(f, g, (n + 1) >> 1);
  PolyIn(g, d, n);
  int M = (n << 1), N = 1, l = 0;
  for (; N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (int i = 0; i < n; i++) d[i] = dec(f[i], d[i]);
  for (int i = n; i < N; i++) d[i] = g[i] = 0;
  d[0]++;
  NTT(d, 1, N), NTT(g, 1, N);
  for (int i = 0; i < N; i++) g[i] = mul(g[i], d[i]);
  NTT(g, -1, N);
  for (int i = n; i < N; i++) g[i] = 0;
}
void Polyqkpow(int *F, int *G, int k, int n) {
  for (int i = 0; i < n; i++) D[i] = G[i] = 0;
  PolyIn(F, D, n);
  for (int i = 0; i < n; i++) D[i] = mul(D[i], k);
  PolyExp(D, G, n);
}
void Polysqrt(int *f, int *g, int n) {
  if (n == 1) {
    g[0] = qkpow(f[0], mod - 2, mod);
    return;
  }
  Polysqrt(f, g, (n + 1) >> 1);
  int M = 2 * n, N = 1, l = 0;
  for (; N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (int i = 0; i < n; i++) A[i] = f[i], B[i] = 0;
  for (int i = n; i < N; i++) A[i] = 0, B[i] = 0;
  Polyinv(g, B, n);
  NTT(A, 1, N), NTT(B, 1, N);
  for (int i = 0; i < N; i++) A[i] = mul(A[i], B[i]);
  NTT(A, -1, N);
  for (int i = 0; i < n; i++) g[i] = mul(add(g[i], A[i]), inv2);
}
void Polysin(int *f, int *g, int n) {
  int ecsy = 86583718, fuecsy = 911660635, iinv = qkpow(ecsy, mod - 2, mod);
  for (int i = 0; i < n; i++) A[i] = mul(f[i], ecsy), B[i] = mul(f[i], fuecsy);
  PolyExp(A, AAA, n), PolyExp(B, BBB, n);
  for (int i = 0; i < n; i++) g[i] = mul(mul(dec(AAA[i], BBB[i]), inv2), iinv);
}
void Polycos(int *f, int *g, int n) {
  int ecsy = 86583718, fuecsy = 911660635;
  for (int i = 0; i < n; i++) A[i] = mul(f[i], ecsy), B[i] = mul(f[i], fuecsy);
  PolyExp(A, AAA, n), PolyExp(B, BBB, n);
  for (int i = 0; i < n; i++) g[i] = mul(add(AAA[i], BBB[i]), inv2);
}
void Polyasin(int *f, int *g, int n) {
  static int fbie[MAXN], FF[MAXN], A[MAXN], B[MAXN], Fs[MAXN], Finv[MAXN];
  for (int i = 0; i < (n << 1); i++)
    fbie[i] = FF[i] = A[i] = B[i] = Fs[i] = Finv[i] = 0;
  Polydao(f, fbie, n);
  int M = (n << 1), N = 1, l = 0;
  for (; N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < n; i++) A[i] = B[i] = f[i];
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  NTT(A, 1, N), NTT(B, 1, N);
  for (int i = 0; i < N; i++) FF[i] = mul(A[i], B[i]);
  NTT(FF, -1, N);
  for (int i = 0; i < n; i++) FF[i] = dec(i == 0 ? 1 : 0, FF[i]);
  for (int i = n; i < N; i++) FF[i] = 0;
  Polysqrt(FF, Fs, n);
  Polyinv(Fs, Finv, n);
  M = (n << 1), N = 1, l = 0;
  for (; N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  NTT(fbie, 1, N), NTT(Finv, 1, N);
  for (int i = 0; i < N; i++) fbie[i] = mul(fbie[i], Finv[i]);
  NTT(fbie, -1, N);
  Polyjifen(fbie, g, n);
}
void Polyatan(int *f, int *g, int n) {
  static int fbie[MAXN], FF[MAXN], A[MAXN], B[MAXN], Finv[MAXN];
  for (int i = 0; i < (n << 1); i++)
    fbie[i] = FF[i] = A[i] = B[i] = Finv[i] = 0;
  Polydao(f, fbie, n);
  int M = (n << 1), N = 1, l = 0;
  for (; N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < n; i++) A[i] = B[i] = f[i];
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  NTT(A, 1, N), NTT(B, 1, N);
  for (int i = 0; i < N; i++) FF[i] = mul(A[i], B[i]);
  NTT(FF, -1, N);
  for (int i = 0; i < n; i++) FF[i] = add(i == 0 ? 1 : 0, FF[i]);
  for (int i = n; i < N; i++) FF[i] = 0;
  Polyinv(FF, Finv, n);
  M = (n << 1), N = 1, l = 0;
  for (; N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  NTT(fbie, 1, N), NTT(Finv, 1, N);
  for (int i = 0; i < N; i++) fbie[i] = mul(fbie[i], Finv[i]);
  NTT(fbie, -1, N);
  Polyjifen(fbie, g, n);
}
void mul(int *s, int *a, int len) {
  static int t[MAXN];
  __builtin_memcpy(t, a, sizeof(int) * len);
  NTT(s, 1, len), NTT(t, 1, len);
  for (int i = 0; i < len; i++) s[i] = mul(s[i], t[i]);
  NTT(s, -1, len);
  for (int i = 0; i < len; i++) s[i] = !!s[i];
}
int main() {
  init();
  scanf("%d %d %d", &n, &m, &k);
  fac[0] = facn[0] = 1;
  for (int i = 1; i < k + 1; i++)
    fac[i] = mul(fac[i - 1], i), facn[i] = qkpow(fac[i], mod - 2, mod);
  for (int i = 0; i < k + 1; i++)
    f[i] = mul(qkpow(mod - 1, i, mod), facn[i]),
    g[i] = mul(qkpow(i, k, mod), facn[i]);
  int l = 0, M, N = 1;
  for (M = 2 * (k + 1); N <= M; N <<= 1, l++)
    ;
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  NTT(f, 1, N), NTT(g, 1, N);
  for (int i = 0; i < N; i++) f[i] = mul(f[i], g[i]);
  NTT(f, -1, N);
  long long now = 1, ans = 0;
  for (int j = 0; j <= min(k, n); j++) {
    ans = add(ans, mul(mul(mul(f[j], fac[j]), now), qkpow(m, n - j, mod)));
    now = mul(now, n - j), now = mul(now, qkpow(j + 1, mod - 2, mod));
  }
  printf("%d", mul(ans, qkpow(qkpow(m, n, mod), mod - 2, mod)));
  return 0;
}
