#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
char buf[100000], *p1 = buf, *p2 = buf;
inline int gi() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return (f == 1) ? x : -x;
}
inline int min(int a, int b) { return a < b ? a : b; }
inline int max(int a, int b) { return a > b ? a : b; }
const int mod = 1e9 + 7, maxn = 1e6 + 5;
int n, m, a, b;
int fac[maxn], inv[maxn];
inline int qpow(int x, int k) {
  if (k < 0) k = -k, x = qpow(x, mod - 2);
  int ret = 1;
  while (k) {
    if (k & 1) ret = 1ll * ret * x % mod;
    x = 1ll * x * x % mod, k >>= 1;
  }
  return ret;
}
inline void init() {
  fac[0] = fac[1] = inv[0] = inv[1] = 1;
  for (int i = 2; i <= maxn - 1; ++i)
    fac[i] = 1ll * fac[i - 1] * i % mod,
    inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
  for (int i = 2; i <= maxn - 1; ++i) inv[i] = 1ll * inv[i - 1] * inv[i] % mod;
}
inline void input() { n = gi(), m = gi(), a = gi(), b = gi(); }
inline int C(int n, int m) {
  if (n < m) return 0;
  if (n < 0 || m < 0) return 0;
  return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod;
}
inline void solve() {
  int ans = 0;
  for (int i = 1; i <= n; ++i) {
    int sum = C(n - 2, i - 1);
    sum = 1ll * sum * fac[i - 1] % mod;
    sum = 1ll * sum * C(m - 1, i - 1) % mod;
    sum = 1ll * qpow(n, n - i - 2) * sum % mod * (i + 1) % mod;
    sum = 1ll * sum * qpow(m, n - i - 1) % mod;
    ans = (ans + sum) % mod;
  }
  printf("%d\n", ans);
}
int main() {
  init();
  input();
  solve();
  return 0;
}
