#include <bits/stdc++.h>
using namespace std;
const int INF = (int)2e9;
const long long INFL = (long long)9e18;
const int MAXINT = ((~0) ^ (1 << 31));
const long long MAXLL = ((~0) ^ ((long long)1 << 63));
template <class T>
inline T pow2(T a) {
  return a * a;
}
template <class T>
inline bool mineq(T& a, T b) {
  return (a > b) ? (a = b, true) : false;
}
template <class T>
inline bool maxeq(T& a, T b) {
  return (a < b) ? (a = b, true) : false;
}
const int maxn = (int)355;
;
const int MOD = (int)1e9 + 7;
;
const int sq = 350;
const int maxm = 1e5 + 10;
long long dp[maxn][maxn][2];
long long n, m, x;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> x;
  if (n > sq) {
    cout << 0;
    return 0;
  }
  int mask = 0;
  dp[0][0][mask] = 1;
  for (int id = 1; id < (int)(m + 1); id++) {
    mask ^= 1;
    for (int i = 0; i < (int)(n + 1); i++)
      for (int j = 0; j < (int)(n + 1); j++) dp[i][j][mask] = 0;
    for (int open = 0; open < (int)(n + 1); open++) {
      for (int close = 0; close < (int)(open + 1); close++) {
        if (open) dp[open][close][mask] += dp[open - 1][close][!mask];
        if (open && close)
          dp[open][close][mask] += dp[open - 1][close - 1][!mask];
        if (close && id != x)
          dp[open][close][mask] += dp[open][close - 1][!mask];
        if (id != x) dp[open][close][mask] += dp[open][close][!mask];
        while (dp[open][close][mask] >= MOD) dp[open][close][mask] -= MOD;
      }
    }
  }
  for (int i = 1; i < (int)(n + 1); i++)
    dp[n][n][mask] = ((long long)dp[n][n][mask] * i) % MOD;
  cout << dp[n][n][mask] << endl;
}
