#include
using namespace std;
#define _l (long long int)
const int maxn = 103; const int mod = 1e9 + 7;
int modPow(int a, int x) { int s(1); for (; x; x »= 1, a = _l a * a % mod) if (x & 1) s = _l s * a % mod; return s; }
int fac[maxn], finv[maxn], vinv[maxn]; int n, m, k, f[maxn], c[maxn];
void pre() { fac[0] = finv[0] = 1; for (int i = 1; i < maxn; ++ i) { fac[i] = _l fac[i - 1] * i % mod; vinv[i] = modPow(i, mod - 2); finv[i] = _l finv[i - 1] * vinv[i] % mod; } }
inline int comb(int n, int k) { if (k > n || k < 0) return 0; else return _l fac[n] * finv[k] % mod * finv[n - k] % mod; } int hcomb(int n, int k) { int s(1); for (int i = 0; i < k; ++ i) s = _l s * (n - i + mod) % mod; return _l s * finv[k] % mod; } inline int align(int n, int k) { if (k > n || k < 0) return 0; else return _l fac[n] * finv[n - k] % mod; }
void calc(int z) { int w(fac[n]), t(fac[k]); for (int i = 0; i < z; ++ i) w = _l w * finv[c[i]] % mod; for (int i = 0, j; i < z; i = j) { for (j = i; j < z && c[i] == c[j]; ++ j); t = _l t * finv[j - i] % mod; } t = _l t * finv[k - z] % mod; for (int i = m; i; – i) { int wp(1), tp(1); for (int j = i - 1; j >= 0 && j + t >= i; – j) { wp = _l wp * w % mod; tp = _l tp * (t - (i - j - 1)) % mod * vinv[i - j] % mod; f[i] = (f[i] + _l f[j] * tp % mod * wp) % mod; } } }
void DFS(int c, int v, int d) { if (!c) { calc(d); } else if (d >= k) { return; } else { for (int i = 1; i <= c && i <= v; ++ i) DFS(c - i, (:: c[d] = i), d + 1); } }
int main() { #ifdef LAEKOV_LOCAL freopen(".in", “r”, stdin); #endif
scanf("%d%d%d", &m, &n, &k);
memset(f, 0, sizeof(f));
f[0] = 1;
pre();
DFS(n, n, 0);
printf("%d\n", (int)(_l f[m] * fac[m] % mod));
}