#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 7, mod = 1e9 + 7, M = 1000 + 7;
long long POW(long long a, long long b, long long mod) {
  a %= mod;
  long long r = 1;
  for (long long i = b; i > 0; i >>= 1) {
    if (i & 1) r = (r * a) % mod;
    a = (a * a) % mod;
  }
  return r;
}
long long f[N], dp[M][M];
long long nCr(long long n, long long r) {
  if (n < r) return 0;
  return f[n] * POW(f[n - r] * f[r], mod - 2, mod) % mod;
}
long long T(long long m, long long n) {
  if (n == 1) return 1;
  if (n == m) return f[m];
  if (~dp[m][n]) return dp[m][n];
  long long res = T(m - 1, n) + T(m - 1, n - 1) % mod;
  return dp[m][n] = res * n % mod;
}
int32_t main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  f[0] = 1;
  for (long long i = 1; i < N; i++) {
    f[i] = (f[i - 1] * i) % mod;
  }
  memset(dp, -1, sizeof dp);
  long long ans = 0, n, m, k;
  cin >> n >> m >> k;
  if (m == 1) {
    for (long long i = 1; i <= k && i <= n; i++) {
      ans += nCr(k, i) * T(n, i) % mod;
      ans %= mod;
    }
    cout << ans << endl;
    return 0;
  }
  if (m == 2) {
    for (long long i = 1; i <= n && i <= k; i++) {
      long long x = (nCr(k, i) * T(n, i) % mod);
      ans += x * x % mod;
      ans %= mod;
    }
    cout << ans << endl;
    return 0;
  }
  for (long long i = 1; i <= 2 * n && i <= k; i++) {
    for (long long j = 1; j <= i; j++) {
      if ((i - j) & 1) continue;
      long long x = (i - j) / 2;
      if (x + j > n) continue;
      long long aa = nCr(k, i) * nCr(i, j) % mod;
      long long bb = nCr(i - j, x) * POW(POW(j, n, mod), m - 2, mod) % mod;
      long long cc = T(n, x + j) * T(n, x + j) % mod;
      aa = (aa * bb) % mod;
      aa = (aa * cc) % mod;
      ans = (ans + aa) % mod;
    }
  }
  cout << ans << endl;
}
