#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1.1e6;
const int MOD = (int)(1e9) + 7;
int fact[MAXN];
int mpow(int x, int y) {
  if (y == 0) return 1;
  int hlf = mpow(x, y / 2);
  int ans = (1LL * hlf * hlf) % MOD;
  if (y % 2) ans = (1LL * ans * x) % MOD;
  return ans;
}
int minv(int x) { return mpow(x, MOD - 2); }
int binom(int n, int k) {
  int A = (1LL * fact[n] * minv(fact[k])) % MOD;
  A = (1LL * A * minv(fact[n - k])) % MOD;
  return A;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, m, a, b;
  cin >> n >> m >> a >> b;
  fact[0] = 1;
  for (int i = 1; i < MAXN; i++) fact[i] = (1LL * fact[i - 1] * i) % MOD;
  int ans = 0;
  int perm = 1;
  for (int len = 1; len <= min(m, n - 1); len++) {
    int assgn = binom(m - 1, len - 1);
    int cayley =
        (len + 1 == n) ? 1 : (1LL * (len + 1) * mpow(n, n - len - 2)) % MOD;
    int edge_assgn = mpow(m, n - len - 1);
    int to_add = 1;
    to_add = (1LL * to_add * assgn) % MOD;
    to_add = (1LL * to_add * cayley) % MOD;
    to_add = (1LL * to_add * edge_assgn) % MOD;
    to_add = (1LL * to_add * perm) % MOD;
    perm = (1LL * perm * (n - len - 1)) % MOD;
    ans += to_add;
    ans %= MOD;
  }
  cout << ans << '\n';
  return 0;
}
