#include<bits/stdc++.h>
#define db double
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
#define int long long
using namespace std;
bool MBE;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int md=1e9+7;
int n,m,c,fac[510],inv[510],f[510],res;
inline int pw(int x,int y){
int ans=1;
while(y){
if(y&1)ans=ans*x%md;
x=x*x%md;
y>>=1;
}
return ans;
}
int C(int x,int y){
if(x<y)return 0;
if(x==y||y==0)return 1;
return fac[x]*inv[y]%md*inv[x-y]%md;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
n=read(),m=read(),c=read();
int p=500;
fac[0]=fac[1]=inv[0]=inv[1]=1;
for(int i=2;i<=p;i++)
fac[i]=fac[i-1]*i%md,inv[i]=inv[md%i]*(md-md/i)%md;
for(int i=2;i<=p;i++)
inv[i]=inv[i-1]*inv[i]%md;
for(int i=0;i<=c;i++){
for(int k=0;k<=m;k++)
f[i]=(f[i]+((k&1)?(md-1):1)*C(m,k)%md*pw(pw(i+1,k)-1+md,n)%md)%md;
}
for(int i=0;i<=c;i++){
res=(res+((i&1)?(md-1):1)*C(c,i)%md*f[c-i]%md)%md;
}
printf("%lld\n",res);
bool MED;
cerr<<(&MED-&MBE)/1048576.0<<" MB, "<<1000*clock()/CLOCKS_PER_SEC<<" ms\n";
return 0;
}