#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
int n, m, kk;
int d[1024][1024], cnk[1024][1024], fact[1024 * 2], revfact[1024 * 2];
int pw[1024];
long long fastpow(long long x, long long n, long long mod) {
  long long res = 1;
  while (n)
    if (n % 2) {
      res = (res * x) % mod;
      n--;
    } else {
      x = (x * x) % mod;
      n /= 2;
    }
  return res;
}
template <typename T>
T euclide(T a, T b, T &x, T &y) {
  if (a < 0) {
    T g = euclide(-a, b, x, y);
    x = -x;
    return g;
  }
  if (b < 0) {
    T g = euclide(a, -b, x, y);
    y = -y;
    return g;
  }
  if (a < b) return euclide(b, a, y, x);
  if (!b) {
    x = 1;
    y = 0;
    return a;
  }
  T x1, y1;
  T g = euclide(b, a % b, x1, y1);
  x = y1;
  y = x1 - (a / b) * y1;
  return g;
}
template <class T>
inline T inverse(T a, T n) {
  T x, y;
  euclide(a, n, x, y);
  return ((x % n) + n) % n;
}
int main() {
  scanf("%d%d%d", &n, &m, &kk);
  d[0][0] = 1;
  for (int i = 0, _n = (n); i < _n; i++)
    for (int j = 0, _n = (i + 1); j < _n; j++) {
      d[i + 1][j] = (d[i + 1][j] + d[i][j] * (long long)j) % 1000000007;
      d[i + 1][j + 1] = (d[i + 1][j + 1] + (long long)d[i][j]) % 1000000007;
    }
  if (m >= 2)
    for (int i = 0, _n = (n + 1); i < _n; i++)
      pw[i] = fastpow(i, n * (m - 2), 1000000007);
  if (n * (m - 2) == 0)
    pw[0] = 1;
  else
    pw[0] = 0;
  memset(cnk, 0, sizeof cnk);
  ;
  cnk[0][0] = 1;
  for (int _b = (n), i = (1); i <= _b; i++) {
    cnk[i][0] = 1;
    for (int _b = (i), j = (1); j <= _b; j++)
      cnk[i][j] = (cnk[i - 1][j - 1] + cnk[i - 1][j]) % 1000000007;
  }
  fact[0] = 1;
  revfact[0] = 1;
  for (int _b = (n * 2), i = (1); i <= _b; i++) {
    fact[i] = (fact[i - 1] * (long long)i) % 1000000007;
    revfact[i] = (revfact[i - 1] * (long long)(kk + 1 - i)) % 1000000007;
  }
  long long res = 0;
  if (m >= 2) {
    for (int _b = (min(n, kk)), k = (1); k <= _b; k++) {
      long long base = (d[n][k] * (long long)d[n][k]) % 1000000007;
      for (int _b = (k), p = (0); p <= _b; p++) {
        long long t = ((((revfact[2 * k - p] * (long long)cnk[k][p]) %
                         1000000007 * (long long)fact[p]) %
                        1000000007 * (long long)base) %
                       1000000007 * cnk[k][p]) %
                      1000000007;
        res = (res + t * (long long)pw[p]) % 1000000007;
      }
    }
  } else {
    for (int _b = (min(n, kk)), k = (1); k <= _b; k++)
      res = (res + d[n][k] * (long long)revfact[k]) % 1000000007;
  }
  res %= 1000000007;
  printf("%d\n", (int)res);
  return 0;
}
