#include <bits/stdc++.h>
using namespace std;
const int M = 1e9 + 7;
const int MAXN = 1e6 + 10;
long long n, m, a, b;
long long modpow(long long p, long long b) {
  if (p < 0) return 0;
  if (p == 0) return 1;
  long long a = modpow(p / 2, b);
  return (p % 2 ? a * a % M * b % M : a * a % M);
}
long long minv(long long b) { return modpow(M - 2, b); }
long long fact[MAXN];
long long inv[MAXN];
long long choose(long long n, long long k) {
  return fact[n] * inv[k] % M * inv[n - k] % M;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  fact[0] = 1;
  inv[0] = 1;
  for (int i = 1; i < MAXN; i++) {
    fact[i] = fact[i - 1] * i % M;
    inv[i] = minv(fact[i]);
    assert(inv[i] * fact[i] % M == 1);
  }
  cin >> n >> m >> a >> b;
  if (a == b) {
    cout << 0 << endl;
    return 0;
  }
  int lim = min(m, n - 1);
  long long ans = 0;
  for (int k = 1; k <= lim; k++) {
    long long path = k + 1;
    long long trees = path * modpow(n - path - 1, n) % M;
    if (k == n - 1) trees = 1;
    ans += choose(m - 1, m - k) * fact[k - 1] % M * choose(n - 2, k - 1) % M *
           modpow(n - path, m) % M * trees % M;
    ans %= M;
  }
  cout << ans << endl;
}
