#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool smin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}
template <typename T>
inline bool smax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
const long long mod = (long long)1e9 + 7;
long long n, m, x;
void add(long long &a, long long b) { ((a += b) >= mod ? a -= mod : 0); }
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> x;
  if (n > m) return cout << 0 << '\n', 0;
  long long dp[2][n + 2][n + 2];
  memset(dp, 0, sizeof dp);
  dp[0][0][0] = 1;
  for (long long pos = 1; pos <= m; ++pos) {
    for (long long used = 0; used <= n; ++used) {
      for (long long close = 0; close <= used; ++close) {
        long long &cur = dp[pos & 1][used][close];
        cur = 0;
        if (close != used) {
          add(cur, dp[(pos & 1) ^ 1][used - 1][close]);
        }
        if (close) {
          add(cur, dp[(pos & 1) ^ 1][used - 1][close - 1]);
        }
        if (pos != x) {
          if (close) {
            add(cur, dp[(pos & 1) ^ 1][used][close - 1]);
          }
          add(cur, dp[(pos & 1) ^ 1][used][close]);
        }
      }
    }
  }
  long long res = dp[m & 1][n][n];
  for (long long i = 1; i <= n; ++i) (res *= i) %= mod;
  cout << res << '\n';
}
