#include <cstdio>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

typedef long long ll;

const int N=105;

int n,m,k,Mo,C[N][N],f[N][N][N][2];

int pwr(int x,int y) {
	int z=1;
	for(;y;y>>=1,x=(ll)x*x%Mo)
		if (y&1) z=(ll)z*x%Mo;
	return z;
}

int main() {
	scanf("%d%d%d%d",&n,&m,&k,&Mo);
	fo(i,0,max(n,m)) {
		C[i][0]=1;
		fo(j,1,i) C[i][j]=(C[i-1][j]+C[i-1][j-1])%Mo;
	}
	f[0][0][0][0]=1;
	fo(x,0,k-1) 
		fo(i,0,n) fo(j,0,m) {
			int ret=1,cnt=(pwr(x+1,m-j)-pwr(x,m-j))%Mo;
			cnt=(ll)cnt*pwr(k-x,j)%Mo;
			fo(l,0,n-i) {
				(f[x][i+l][j][1]+=(ll)f[x][i][j][0]*C[n-i][l]%Mo*ret%Mo)%=Mo;
				ret=(ll)ret*cnt%Mo;
			}
			ret=1;cnt=(pwr(k-x,i)-pwr(k-x-1,i))%Mo;
			cnt=(ll)cnt*pwr(x+1,n-i)%Mo;
			fo(l,0,m-j) {
				(f[x+1][i][j+l][0]+=(ll)f[x][i][j][1]*C[m-j][l]%Mo*ret%Mo)%=Mo;
				ret=(ll)ret*cnt%Mo;
			}
		}
	printf("%d\n",(f[k][n][m][0]+Mo)%Mo);
	return 0;
}