#include <bits/stdc++.h>
using namespace std;
inline void pisz(int n) { printf("%d\n", n); }
template <typename T, typename TT>
ostream& operator<<(ostream& s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T>
ostream& operator<<(ostream& s, vector<T> t) {
  for (int(i) = 0; (i) < (((int)(t.size()))); ++(i)) s << t[i] << " ";
  return s;
}
const long long MOD = 1000000007;
long long powe(long long x, long long pwr) {
  if (pwr == 0) return 1;
  long long w = powe((x * x) % MOD, pwr / 2);
  if (pwr & 1) w = (w * x) % MOD;
  return w;
}
long long modinvv(long long i) { return powe(i, MOD - 2); }
long long nt[1000 + 1][1000 + 1];
void initnewton() {
  for (int(n) = 0; (n) < (1000 + 1); ++(n)) nt[n][0] = 1;
  for (int(k) = 1; (k) <= (1000); ++(k)) nt[0][k] = 0;
  for (int(n) = 1; (n) <= (1000); ++(n))
    for (int(k) = 1; (k) <= (1000); ++(k))
      nt[n][k] = (nt[n - 1][k - 1] + nt[n - 1][k]) % MOD;
}
long long modinv[1005], kol[1005], d[1005][1005];
int main() {
  for (int(i) = 1; (i) <= (1001); ++(i)) modinv[i] = modinvv(i);
  int(n), (m), (k);
  scanf("%d %d %d", &(n), &(m), &(k));
  initnewton();
  kol[0] = 0;
  for (int(i) = 1; (i) <= (1000); ++(i)) {
    kol[i] = powe(i, n);
    for (int(j) = (1); (j) <= (i - 1); ++j) {
      kol[i] -= nt[i][j] * kol[j];
      kol[i] %= MOD;
    }
  }
  if (m == 1) {
    long long w = powe(k, n);
    if (w < 0) w += MOD;
    pisz(w);
    return 0;
  }
  d[0][0] = 1;
  for (int(a) = 0; (a) < (1000); ++(a))
    d[a + 1][0] = (((d[a][0] * (k - a)) % MOD) * modinv[a + 1]) % MOD;
  for (int(b) = 0; (b) < (1000); ++(b)) {
    for (int(a) = 0; (a) < (1001); ++(a)) {
      long long u = d[a][b];
      u *= ((long long)(k - 2 * b - a) * (k - 2 * b - a - 1)) % MOD;
      u %= MOD;
      for (int(f) = 0; (f) < (2); ++(f)) {
        u *= modinv[b + 1];
        u %= MOD;
      }
      d[a][b + 1] = u;
    }
  }
  long long suma = 0;
  for (long long a = 0; a <= n && a <= k; ++a) {
    for (long long b = 0; a + b <= n && a + 2 * b <= k; ++b) {
      long long wyr = d[a][b];
      wyr *= powe(a, (m - 2) * n);
      wyr %= MOD;
      for (int(f) = 0; (f) < (2); ++(f)) {
        wyr *= kol[a + b];
        wyr %= MOD;
      }
      suma = (suma + wyr) % MOD;
    }
  }
  if (suma < 0) suma += MOD;
  pisz(suma);
}
