#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXN = 200;
int n, maxdeg, MOD;
int C[MAXN + 1][MAXN + 1];
int mono[MAXN + 1][MAXN + 1];
int monosum[MAXN + 1];
void run() {
  scanf("%d%d%d", &n, &maxdeg, &MOD);
  for (int i = (0); i <= (n); ++i) {
    C[i][0] = C[i][i] = 1;
    for (int j = (1); j < (i); ++j)
      C[i][j] = ((long long)C[i - 1][j - 1] + C[i - 1][j]) % MOD;
  }
  memset(mono, 0, sizeof(mono));
  mono[1][0] = 1;
  if (maxdeg != 0) monosum[1] = 1;
  for (int i = (2); i <= (n); ++i) {
    for (int j = (1); j <= (maxdeg); ++j)
      for (int ii = (1); ii <= (i - 1); ++ii) {
        int ways = C[i - 2][ii - 1];
        ways = (long long)ways * monosum[ii] % MOD;
        ways = (long long)ways * mono[i - ii][j - 1] % MOD;
        mono[i][j] = ((long long)mono[i][j] + ways) % MOD;
      }
    monosum[i] = 0;
    for (int j = (0); j <= (maxdeg - 1); ++j)
      monosum[i] = ((long long)monosum[i] + mono[i][j]) % MOD;
  }
  int duo = 0;
  for (int j = (0); j <= (n); ++j) duo = ((long long)duo + mono[n][j]) % MOD;
  for (int i = (3); i <= (n); ++i)
    for (int j = (2); j <= (maxdeg); ++j)
      for (int jj = (0); jj <= (maxdeg - j); ++jj) {
        int ways = (long long)mono[i][j] * mono[n - i + 1][jj] % MOD;
        duo = ((long long)duo + ways) % MOD;
      }
  int paths = (long long)n * (n - 1) % MOD;
  int ret = (long long)2 * duo * paths % MOD;
  printf("%d\n", ret);
}
int main() {
  run();
  return 0;
}
