#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
int n, m, k;
unsigned long long fac[1000005] = {1}, rev[1000005] = {1};
unsigned long long dp[1005];
unsigned long long PowMod(unsigned long long a, unsigned long long b) {
  unsigned long long ret = 1;
  while (b) {
    if (b & 1) ret = ret * a % 1000000007;
    a = a * a % 1000000007;
    b >>= 1;
  }
  return ret;
}
void Init() {
  for (int i = 1; i <= 1000000; i++)
    fac[i] = fac[i - 1] * i % 1000000007,
    rev[i] = PowMod(fac[i], 1000000007 - 2);
}
unsigned long long C(int n, int m) {
  return (fac[n] * rev[m] % 1000000007) * rev[n - m] % 1000000007;
}
int main() {
  Init();
  while (scanf("%d%d%d", &n, &m, &k) != EOF) {
    if (m == 1) {
      printf("%I64d\n", PowMod(k, n));
      continue;
    }
    for (int i = 1; i <= n && i <= k; i++) {
      dp[i] = PowMod(i, n);
      for (int j = 1; j < i; j++) {
        dp[i] =
            (dp[i] - C(i, j) * dp[j] % 1000000007 + 1000000007) % 1000000007;
      }
    }
    unsigned long long ret = 0;
    if (m == 2) {
      for (int i = 1; i <= n && i <= k; i++) {
        unsigned long long tmp = (dp[i] * dp[i]) % 1000000007;
        tmp = (tmp * C(k, i) % 1000000007) * C(k, i) % 1000000007;
        ret = (ret + tmp) % 1000000007;
      }
    } else {
      for (int i = 1; i <= n && i <= k; i++) {
        for (int j = 0; j <= n && j <= k; j++) {
          if (k < 2 * j + i || i + j > n) break;
          unsigned long long tmp = dp[i + j] * dp[i + j] % 1000000007;
          tmp = ((tmp * C(k, i) % 1000000007) * C(k - i, j) % 1000000007) *
                C(k - i - j, j) % 1000000007;
          tmp = (tmp * PowMod(i, n * (m - 2))) % 1000000007;
          ret = (ret + tmp) % 1000000007;
        }
      }
    }
    printf("%I64d\n", ret);
  }
  return 0;
}
