#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
long long dp[2000], n, m, k, fact[2000000], niyuan[2000000], ans;
inline long long sqr(long long x1) { return x1 * x1 % mod; }
long long exp(int x1, int x2) {
  if (x2 == 0) return 1;
  if (x2 == 1) return x1;
  if (x2 & 1)
    return sqr(exp(x1, x2 / 2)) * x1 % mod;
  else
    return sqr(exp(x1, x2 / 2));
}
inline long long c(int x1, int x2) {
  return (fact[x1] * niyuan[x2] % mod) * niyuan[x1 - x2] % mod;
}
inline void chushihua() {
  fact[0] = 1;
  for (int i = 1; i <= k; i++) {
    fact[i] = fact[i - 1] * i % mod;
    niyuan[i] = exp(fact[i], mod - 2);
  }
  niyuan[0] = 1;
  dp[1] = 1;
  for (int i = 2; i <= min(n, k); i++) {
    dp[i] = exp(i, n);
    for (int j = 1; j < i; j++) {
      dp[i] -= ((c(i, j) * dp[j]) % mod);
      dp[i] += mod;
      dp[i] %= mod;
    }
  }
}
int main() {
  cin >> n >> m >> k;
  chushihua();
  if (m == 1) {
    cout << exp(k, n) << endl;
    return 0;
  }
  if (m == 2) {
    for (int i = 1; i <= min(n, k); i++) {
      ans += sqr(c(k, i) * dp[i] % mod);
      ans %= mod;
    }
  } else {
    for (int i = 1; i <= min(n, k); i++) {
      for (int j = 0; j <= min(n, k); j++) {
        if (k >= j * 2 + i && i + j <= n) {
          ans +=
              ((((sqr(dp[i + j]) * c(k - i, j) % mod) * c(k - i - j, j) % mod) *
                exp(i, n * (m - 2)) % mod) *
               c(k, i) % mod);
          ans %= mod;
        }
      }
    }
  }
  cout << ans << endl;
  return 0;
}
