#include <bits/stdc++.h>
using namespace std;
int gcd(int x, int y) { return (!y ? x : gcd(y, x % y)); }
const int mod = 1e9 + 7;
int mu(int x, int y) { return 1LL * x * y % mod; }
inline int bpow(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = mu(res, x);
    y >>= 1;
    x = mu(x, x);
  }
  return res;
}
const int maxn = 1e6 + 10;
int fact[maxn], inv[maxn];
int comb(int r, int n) {
  if (r < 0 || r > n || n < 0) return 0;
  return mu(fact[n], mu(inv[r], inv[n - r]));
}
int32_t main() {
  ios::sync_with_stdio(0), cin.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < maxn; i++) {
    fact[i] = (!i ? 1 : mu(fact[i - 1], i));
    inv[i] = bpow(fact[i], mod - 2);
  }
  int jav = 0;
  for (int len = 2; len <= m + 1 && len <= n; len++) {
    int k = len - 1;
    int ans = comb(k - 1, m - 1);
    ans = mu(ans, comb(len - 2, n - 2));
    ans = mu(ans, fact[len - 2]);
    ans = mu(ans, bpow(m, n - len));
    if (len != n) {
      ans = mu(ans, bpow(n, n - len - 1));
      ans = mu(ans, len);
    }
    jav = (jav + ans) % mod;
  }
  cout << jav << '\n';
}
