#include <bits/stdc++.h>
using namespace std;
const long long kmaxn = 1e5;
const long long kmaxm = 4e3 + 5;
const long long M = 1e9 + 7;
long long fac[kmaxn], finv[kmaxn];
long long S2[kmaxm][kmaxm];
long long suf[kmaxn], sinv[kmaxn];
long long MAX;
long long n, m, k;
long long mpow(long long b, long long p) {
  long long ans = 1;
  while (p) {
    if (p & 1) {
      ans *= b;
      ans %= M;
    }
    p >>= 1;
    b *= b;
    b %= M;
  }
  return ans;
}
void init() {
  fac[0] = 1;
  for (long long i = 1; i <= MAX; i++) fac[i] = (fac[i - 1] * i) % M;
  finv[MAX] = mpow(fac[MAX], M - 2);
  for (long long i = MAX - 1; i >= 0; i--)
    finv[i] = (finv[i + 1] * (i + 1)) % M;
  long long tp = max(n, m);
  S2[0][1] = 1;
  for (long long i = 1; i <= tp; ++i) {
    for (long long j = 1; j <= i; ++j) {
      S2[i][j] = S2[i - 1][j] * j % M + S2[i - 1][j - 1];
      S2[i][j] %= M;
    }
  }
  suf[0] = sinv[0] = 1;
  tp = k;
  for (long long i = 1; i <= MAX; ++i, --tp) {
    suf[i] = suf[i - 1] * tp % M;
    sinv[i] = mpow(suf[i], M - 2);
  }
}
long long cal(long long y, long long x) {
  long long ans = 1;
  ans = suf[k - (y - x)] * sinv[k - y] % M;
  return ans;
  while (x--) {
    ans *= y;
    --y;
    ans %= M;
  }
  return ans;
}
long long C(long long x, long long y) { return cal(y, x) * finv[x] % M; }
long long S(long long x, long long y) { return S2[x][y]; }
long long solve(long long s, long long t) {
  long long q = t - s;
  long long mcnt = C(s, k);
  long long lcnt = C(q, k - s);
  long long rcnt = C(q, k - s - q);
  long long lway = S(n, t) * fac[t] % M, rway = S(n, t) * fac[t] % M;
  long long mway = mpow(s, n * (m - 2));
  return mcnt % M * lcnt % M * rcnt % M * lway % M * rway % M * mway % M;
}
void brute() {
  long long ans = 0, cnt = 0, way = 0;
  for (long long i = 1; i <= n; ++i) {
    cnt = C(i, k);
    way = S(n, i) * fac[i] % M;
    ;
    if (m != 1)
      ans += cnt * cnt % M * way % M * way % M;
    else
      ans += cnt * way % M;
    ans %= M;
  }
  cout << ans << endl;
}
void work() {
  MAX = max(n, m) * 4;
  init();
  if (m <= 2) {
    brute();
    return;
  }
  long long ans = 0, tp;
  for (long long i = 1; i <= n; ++i) {
    for (long long s = 1; s <= i; ++s) {
      tp = solve(s, i);
      ans += tp;
      ans %= M;
    }
  }
  cout << ans << endl;
  return;
  while (1) {
    long long x, y;
    cin >> x >> y;
    cout << mpow(x, M - 2) * y % M << endl;
  }
}
signed main() {
  (cin >> n >> m >> k);
  { work(); }
  return 0;
}
