#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0, b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 103;
int mo;
template <typename T1, typename T2>
inline T1 ad(T1 &a, T2 b) {
  return a = a + b >= mo ? a + b - mo : a + b;
}
template <typename T1, typename T2>
inline T1 dl(T1 &a, T2 b) {
  return a = a >= b ? a - b : a - b + mo;
}
inline long long powa(long long a, long long t) {
  long long b = 1;
  while (t) {
    if (t & 1) b = b * a % mo;
    a = a * a % mo, t >>= 1;
  }
  return b;
}
inline long long inva(long long a) { return powa(a, mo - 2); }
long long jc[_], rjc[_];
inline void fuck(int n = _ - 1) {
  jc[0] = jc[1] = rjc[0] = 1;
  for (int i = 2; i <= n; i++) jc[i] = jc[i - 1] * i % mo;
  rjc[n] = inva(jc[n]);
  for (int i = n - 1; i >= 1; i--) rjc[i] = rjc[i + 1] * (1ll + i) % mo;
}
inline long long C(int n, int m) {
  if (n < m || n < 0 || m < 0) return 0;
  return jc[n] * rjc[m] % mo * rjc[n - m] % mo;
}
int n, m, lim;
long long f[_][_][_][2] = {0}, tran[_][_][_][2] = {0};
int main() {
  n = ty(), m = ty(), lim = ty(), mo = ty();
  fuck();
  for (int i = 0; i < lim; i++)
    for (int j = 0; j <= n; j++)
      for (int k = 0; k <= m; k++) {
        tran[i][j][k][0] = (powa(i + 1, n - j) - powa(i, n - j) + mo) % mo *
                           powa(lim - i, j) % mo;
        tran[i][j][k][1] = (powa(lim - i, k) - powa(lim - i - 1, k) + mo) % mo *
                           powa(i + 1, m - k) % mo;
      }
  f[0][0][0][0] = 1;
  for (int i = 0; i < lim; i++) {
    for (int j = 0; j <= n; j++)
      for (int k = 0; k <= m; k++)
        if (f[i][j][k][0])
          for (int a = 0, x = 1; a + k <= m;
               a++, x = 1ll * x * tran[i][j][k][0] % mo)
            ad(f[i][j][k + a][1], f[i][j][k][0] * x % mo * C(m - k, a) % mo);
    for (int j = 0; j <= n; j++)
      for (int k = 0; k <= m; k++)
        if (f[i][j][k][1])
          for (int a = 0, x = 1; a + j <= n;
               a++, x = 1ll * x * tran[i][j][k][1] % mo)
            ad(f[i + 1][j + a][k][0],
               f[i][j][k][1] * x % mo * C(n - j, a) % mo);
  }
  printf("%lld\n", f[lim][n][m][0]);
  return 0;
}
