#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
int sgn(double x) { return x < -eps ? -1 : x > eps; }
int Mn(int& a, int b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
int Mx(int& a, int b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
long long gcd(long long a, long long b) { return a == 0 ? b : gcd(b % a, a); }
long long inv(long long a, long long b) {
  return a == 1 ? 1 : (1 - b * inv(b % a, a)) / a;
}
long long exg(long long a, long long b, int& x, int& y) {
  !a ? x = 0, y = 1 : (exg(b % a, a, y, x), x -= b / a * y);
}
long long pow(long long a, long long b, long long M) {
  long long t = 1;
  for (a %= M; b; b >>= 1) {
    if (b & 1) t = t * a % M;
    a = a * a % M;
  }
  return t;
}
const int M = 1e9 + 7;
struct Comb {
  static const int N = 1e6 + 5, M = 1e9 + 7;
  int n, f[N + 5], inv[N + 5];
  Comb() {
    f[0] = f[1] = inv[0] = inv[1] = 1;
    for (int i = 2; i <= int(N); i++)
      inv[i] = 1LL * (M - M / i) * inv[M % i] % M;
    for (int i = 2; i <= int(N); i++)
      f[i] = 1LL * i * f[i - 1] % M, inv[i] = 1LL * inv[i - 1] * inv[i] % M;
  }
  int C(int n, int m) {
    if (n < m || m < 0) return 0;
    return 1LL * f[n] * inv[m] % M * inv[n - m] % M;
  }
  int lucas(int n, int m) {
    if (n < M) return C(n, m);
    return 1LL * lucas(n / M, m / M) * lucas(n % M, m % M) % M;
  }
  int operator()(int n, int m) { return lucas(n, m); }
} C;
const int N = 1005;
long long ans, n, m, k, f[N];
int main() {
  cin >> n >> m >> k;
  if (m == 1) {
    cout << pow(k, n, M);
    return 0;
  }
  int sum = 0;
  for (int i = 1; i <= int(n); i++) {
    f[i] = pow(i, n, M);
    for (int j = 1; j <= int(i - 1); j++) (f[i] -= C(i, j) * f[j]) %= M;
  }
  for (int i = 1; i <= int(min(n, k)); i++)
    for (int j = 0; j <= int(i); j++) {
      (ans += 1LL * C(k, i) * C(i, j) % M * C(k - i, i - j) % M *
              pow(j, n * m - 2 * n, M) % M * f[i] % M * f[i] % M) %= M;
    }
  cout << (ans % M + M) % M;
}
