#include <bits/stdc++.h>
using namespace std;
int n, m, k;
long long F[1000001], Finv[1000001], S[1001][1001];
long long modexp(int base, int expn) {
  long long res = 1;
  for (int i = (1 << 29); i >= 1; i >>= 1) {
    res *= res;
    res %= 1000000007;
    if (i & expn) {
      res *= base;
      res %= 1000000007;
    }
  }
  return res;
}
long long choose(int num, int den1, int den2 = 0) {
  int den3 = num - den1 - den2;
  long long res = F[num];
  res *= Finv[den1];
  res %= 1000000007;
  res *= Finv[den2];
  res %= 1000000007;
  res *= Finv[den3];
  res %= 1000000007;
  return res;
}
int main() {
  F[0] = Finv[0] = 1;
  for (int N = 1; N <= 1000000; ++N) {
    F[N] = (N * F[N - 1]) % 1000000007;
    Finv[N] = modexp(F[N], 1000000007 - 2);
  }
  S[0][0] = 1;
  for (int N = 1; N <= 1000; ++N) S[N][0] = S[0][N] = 0;
  for (int N = 1; N <= 1000; ++N)
    for (int K = 1; K <= 1000; ++K)
      S[N][K] = (K * (S[N - 1][K - 1] + S[N - 1][K])) % 1000000007;
  cin >> n >> m >> k;
  int colMax = min(k, n);
  long long A[1001];
  for (int K = 0; K <= colMax; ++K) {
    A[K] = 0;
    for (int i = 0; K + i <= colMax; ++i) {
      long long add = choose(k - K, i, i);
      add *= (S[n][K + i] * S[n][K + i]) % 1000000007;
      A[K] += add;
      A[K] %= 1000000007;
    }
  }
  long long res = 0;
  if (m == 1)
    res = modexp(k, n);
  else
    for (int K = 0; K <= colMax; ++K) {
      res += ((A[K] * choose(k, K)) % 1000000007) * modexp(K, (m - 2) * n);
      res %= 1000000007;
    }
  cout << res << endl;
}
