#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int maxn = 1e6;
const int INF = 0x7fffffff;
const int mod = 1e9 + 7;
const double eps = 1e-7;
const double Pi = acos(-1.0);
inline int read_int() {
  char c;
  int ret = 0, sgn = 1;
  do {
    c = getchar();
  } while ((c < '0' || c > '9') && c != '-');
  if (c == '-')
    sgn = -1;
  else
    ret = c - '0';
  while ((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + (c - '0');
  return sgn * ret;
}
inline long long read_ll() {
  char c;
  long long ret = 0, sgn = 1;
  do {
    c = getchar();
  } while ((c < '0' || c > '9') && c != '-');
  if (c == '-')
    sgn = -1;
  else
    ret = c - '0';
  while ((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + (c - '0');
  return sgn * ret;
}
inline long long quick_pow(long long base, long long index, long long p) {
  long long res = 1;
  while (index) {
    if (index & 1) res = res * base % p;
    base = base * base % p;
    index >>= 1;
  }
  return res;
}
int n, m, a, b;
long long f[maxn + 5], inv[maxn + 5], res;
long long pown[maxn + 5], powm[maxn + 5];
long long C(int n, int m) {
  if (n < m) return 0;
  return f[n] * inv[m] % mod * inv[n - m] % mod;
}
int main() {
  n = read_int(), m = read_int(), a = read_int(), b = read_int();
  f[0] = f[1] = inv[0] = inv[1] = pown[0] = powm[0] = 1;
  for (int i = 1; i <= maxn; ++i) {
    pown[i] = pown[i - 1] * n % mod;
    powm[i] = powm[i - 1] * m % mod;
  }
  for (int i = 2; i <= maxn; ++i) {
    f[i] = f[i - 1] * i % mod;
    inv[i] = (mod - mod / i) * inv[mod % i] % mod;
  }
  for (int i = 2; i <= maxn; ++i) inv[i] = inv[i] * inv[i - 1] % mod;
  for (int i = 0; i <= n - 2; ++i) {
    long long u = f[i] * C(m - 1, i) % mod * C(n - 2, i) % mod *
                  powm[n - i - 2] % mod * (i + 2) % mod;
    if (i == n - 2)
      u = u * quick_pow(n, mod - 2, mod) % mod;
    else
      u = u * pown[n - i - 3] % mod;
    res = (res + u) % mod;
  }
  printf("%lld\n", res);
  return 0;
}
