#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void Read(T &x) {
  char c = getchar();
  bool f = false;
  for (x = 0; !isdigit(c); c = getchar()) {
    if (c == '-') {
      f = true;
    }
  }
  for (; isdigit(c); c = getchar()) {
    x = x * 10 + c - '0';
  }
  if (f) {
    x = -x;
  }
}
template <typename T>
inline bool CheckMax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}
template <typename T>
inline bool CheckMin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}
const int N = 205;
unsigned int ans, mod, c[N][N], f[N][N], s[N][N];
int n, m;
int main() {
  Read(n), Read(m), Read(mod);
  for (int i = 0; i <= n; ++i) {
    c[i][0] = 1;
    for (int j = 1; j <= i; ++j) {
      c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
    }
  }
  f[1][0] = 1;
  for (int i = 0; i <= m; ++i) {
    s[1][i] = 1;
  }
  for (int i = 2; i <= n; ++i) {
    for (int j = 1; j < i; ++j) {
      for (int k = 0; k < m; ++k) {
        f[i][k + 1] = (1LL * s[j][m - 1] * c[i - 2][j - 1] % mod * f[i - j][k] +
                       f[i][k + 1]) %
                      mod;
      }
    }
    for (int j = 1; j <= m; ++j) {
      s[i][j] = (s[i][j - 1] + f[i][j]) % mod;
    }
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j <= m; ++j) {
      for (int k = 0; j + k <= m; ++k) {
        if (k != 1) {
          ans = (1LL * f[i + 1][j] * f[n - i][k] + ans) % mod;
        }
      }
    }
  }
  ans = 2LL * n * (n - 1) * ans % mod;
  printf("%u\n", ans);
  return 0;
}
