#include <bits/stdc++.h>
using namespace std;
template <typename T>
void print(T t) {
  for (auto &it : t) cout << it << " ";
  cout << endl;
}
const long long MOD = 1e9 + 7;
const long long MAXN = 1e6 + 5;
namespace COMB {
long long fact[MAXN], invfact[MAXN];
long long binpow(long long a, long long b) {
  long long res = 1;
  while (b) {
    if (b & 1) res = (res * a) % MOD;
    a = (a * a) % MOD;
    b >>= 1;
  }
  return res % MOD;
}
long long inv(long long a) { return binpow(a, MOD - 2); }
long long C(long long n, long long r) {
  if (n < r) return 0;
  return (fact[n] * (invfact[n - r] % MOD * invfact[r] % MOD)) % MOD;
}
void gen_fact() {
  fact[0] = invfact[0] = 1;
  for (long long i = 1; i < MAXN; i++) {
    fact[i] = (i % MOD * fact[i - 1] % MOD) % MOD;
    invfact[i] = inv(fact[i]);
  }
}
long long Cayley(long long n, long long k) {
  return 1ll * k * binpow(n + k, n + MOD - 2) % MOD;
}
}  // namespace COMB
void solve() {
  long long n, m, a, b;
  cin >> n >> m >> a >> b;
  COMB::gen_fact();
  long long cnt = 0;
  for (long long i = 1; i < n and i <= m; i++) {
    long long ans = COMB::C(n - 2, i - 1) * COMB::binpow(m, n - i - 1) % MOD;
    ans %= MOD;
    ans *= COMB::C(m - 1, i - 1) * COMB::fact[i - 1] % MOD;
    ans %= MOD;
    ans *= COMB::Cayley(n - i - 1, i + 1);
    ans %= MOD;
    cnt += ans;
  }
  cout << to_string(cnt % MOD) << endl;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL), cout.tie(NULL);
  ;
  solve();
}
