Problem: Heidi enjoyed performing the simulation because she knew exactly when a new universe would be formed and where, and when a non-existent link would be broken and where.

However, the multiverse itself works in mysterious ways. Well, it works using probabilities, which to some people is mysterious.

At each unit time, when a decision is made, one of the two events will happen randomly. Let's denote l as the current length of the multiverse. With a probability of p_{create} = 1 - l/m, a universe will be created. With a probability of p_{break}=l/m, a non-existent link will be broken at some position.

More specifically, 

  * When a universe is created, it will manifest itself between any two adjacent universes or at one of the ends. Each position occurs with a probability of (1)/(l + 1). 
  * When a link is broken, it could be cut between any two adjacent universes, each with a probability of (1)/(l-1). After separating the multiverse into two segments, the segment NOT containing the Doctor will cease to exist. 



As earlier, the Doctor remains in the same universe. However, if at some point the multiverse breaks in such a way that the Doctor finds himself at the leftmost or rightmost end of it, the TARDIS stops functioning.

In such a case, the Doctor must actually walk across the multiverse to find the tools to fix it.

We are interested in the expected value of the length of the multiverse when such an event occurs.

Input

The first and only line contains three integers n, k and m (1 ≤ k ≤ n ≤ m ≤ 250), the initial length of the multiverse, the initial position of the Doctor, and the maximum possible length of the multiverse.

Output

Output a single integer on a single line, indicating the expected length of the multiverse.

If the answer is p/q, please print r where p ≡ r ⋅ q (mod  10^9 + 7).

Examples

Input


2 1 2


Output


2


Input


2 2 10


Output


2


Input


3 2 3


Output


2


Input


3 2 5


Output


941659828


Input


10 4 20


Output


196683114

Note

For the first and the second test case, without any change to the multiverse, the Doctor is already at one of the ends.

For the third test case, the multiverse can only break at a position, which renders the Doctor at one of its ends.

For the fourth case, things seem to be a little more complicated, because the multiverse can grow and then be broken again.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
namespace vectorops {
template <typename T>
vector<T>& operator+=(vector<T>& a, const vector<T>& b) {
  assert(a.size() == b.size());
  for (int i = 0; i < a.size(); ++i) a[i] = ((long long)a[i] + b[i]) % MOD;
  return a;
}
template <typename T>
vector<T> operator+(vector<T> a, const vector<T>& b) {
  return a += b;
}
template <typename T>
vector<T>& operator-=(vector<T>& a, const vector<T>& b) {
  assert(a.size() == b.size());
  for (int i = 0; i < b.size(); ++i) a[i] = ((long long)a[i] - b[i]) % MOD;
  return a;
}
template <typename T>
vector<T> operator-(vector<T> a, const vector<T>& b) {
  return a -= b;
}
template <typename T>
vector<T> operator-(vector<T> a) {
  for (int i = 0; i < a.size(); ++i) a[i] = -a[i];
  return a;
}
template <typename T>
vector<T> operator*=(vector<T>& a, const T& b) {
  for (int i = 0; i < a.size(); ++i) a[i] = ((long long)a[i] * b) % MOD;
  return a;
}
template <typename T>
vector<T> operator*(vector<T> a, const T& b) {
  return a *= b;
}
};  // namespace vectorops
using namespace vectorops;
vector<long long> coeff[255][255], pre[255][255], diag[255][255];
const int MAXN = 255;
long long fac[MAXN], invfac[MAXN];
long long inv[MAXN];
long long modex(long long a, long long p, long long m = MOD) {
  if (!p) return 1;
  if (p & 1) return a * modex(a, p - 1, m) % m;
  long long v = modex(a, p >> 1, m);
  return v * v % m;
}
template <typename T>
int rref(vector<vector<T>>& mat) {
  int n = mat.size(), m = mat[0].size();
  --m;
  int r, c;
  vector<int> where(m, -1);
  for (r = 0, c = 0; c < m && r < n; ++c) {
    int rr = r;
    for (int i = r + 1; i < n; ++i)
      if (mat[i][c]) rr = i;
    if (!mat[rr][c]) {
      continue;
    }
    for (int j = 0; j <= m; ++j) swap(mat[rr][j], mat[r][j]);
    long long mult = modex(mat[r][c], MOD - 2);
    for (int j = c; j <= m; ++j) mat[r][j] = mult * mat[r][j] % MOD;
    for (int i = 0; i < n; ++i) {
      if (i == r) continue;
      long long t = mat[i][c];
      for (int j = 0; j <= m; ++j) {
        mat[i][j] = (mat[i][j] - t * mat[r][j]) % MOD;
        if (mat[i][j] < 0) mat[i][j] += MOD;
      }
    }
    ++r;
  }
  return r;
}
int main() {
  fac[0] = 1;
  for (int i = 1; i < MAXN; ++i) fac[i] = fac[i - 1] * i % MOD;
  invfac[MAXN - 1] = modex(fac[MAXN - 1], MOD - 2);
  for (int i = MAXN - 2; i >= 0; --i) invfac[i] = invfac[i + 1] * (i + 1) % MOD;
  for (int i = 1; i < MAXN; ++i) inv[i] = invfac[i] * fac[i - 1] % MOD;
  int n, k, m;
  scanf("%d%d%d", &n, &k, &m);
  if (k == 1 || k == n) {
    printf("%d\n", n);
    return 0;
  }
  for (int i = 1; i <= m; ++i) {
    for (int j = 1; j <= i; ++j) {
      coeff[i][j].resize(m - 1);
      if (j == 1 || j == i) {
        coeff[i][j][m - 2] = i;
        if (j == i) pre[i][j] = coeff[i][j];
        if (j == 1) diag[i][j] = coeff[i][j];
      } else if (j == 2) {
        coeff[i][j][i - 3] = 1;
        pre[i][j] = coeff[i][j] + pre[i - 1][j];
        diag[i][j] = coeff[i][j] + diag[i - 1][j - 1];
      }
    }
  }
  vector<vector<long long>> mat;
  for (int i = 3; i <= m; ++i)
    for (int j = 2; j < i; ++j) {
      pre[i][j] = coeff[i][j] + pre[i - 1][j];
      diag[i][j] = coeff[i][j] + diag[i - 1][j - 1];
      vector<long long> res = coeff[i][j];
      long long rem = inv[m] * i % MOD;
      long long create = (1 - rem) % MOD;
      long long me = inv[i + 1] * j % MOD;
      res -= pre[i - 1][j] * (rem * inv[i - 1] % MOD);
      res -= diag[i - 1][j - 1] * (rem * inv[i - 1] % MOD);
      if (create) {
        res -= coeff[i + 1][j] * (create * (1 - me) % MOD);
        res *= modex(me * create % MOD, MOD - 2);
        coeff[i + 1][j + 1] = res;
      } else {
        res[m - 2] = -res[m - 2];
        mat.push_back(res);
      }
    }
  assert(mat.size() == m - 2);
  if (false)
    cerr << "mat[0]"
         << "=";
  for (auto _x : mat[0])
    if (false) cerr << _x << ", ";
  if (false) cerr << endl;
  rref(mat);
  long long ans = coeff[n][k][m - 2];
  for (int i = 0; i < m - 2; ++i) {
    ans += coeff[n][k][i] * mat[i][m - 2];
    ans %= MOD;
  }
  if (ans < 0) ans += MOD;
  printf("%lld\n", ans);
}