#include <bits/stdc++.h>
using namespace std;
const int maxd = 1000000007, N = 1000000;
const double pi = acos(-1.0);
int n, m, a, b;
long long fac[1001000], invfac[1001000], mpow[1001000], npow[1001000];
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while ((ch < '0') || (ch > '9')) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ((ch >= '0') && (ch <= '9')) {
    x = x * 10 + (ch - '0');
    ch = getchar();
  }
  return x * f;
}
long long A(int x, int y) {
  if ((x < y) || (x < 0) || (y < 0)) return 0;
  return (fac[x] * invfac[x - y]) % maxd;
}
long long C(int x, int y) {
  if ((x < y) || (x < 0) || (y < 0)) return 0;
  return ((fac[x] * invfac[x - y]) % maxd * invfac[y]) % maxd;
}
long long qpow(long long x, long long y) {
  long long ans = 1, sum = x;
  while (y) {
    int tmp = y % 2;
    y /= 2;
    if (tmp) ans = (ans * sum) % maxd;
    sum = (sum * sum) % maxd;
  }
  return ans;
}
void init() {
  int i;
  fac[0] = 1;
  invfac[0] = 1;
  for (i = 1; i <= N; i++) fac[i] = (fac[i - 1] * i) % maxd;
  invfac[N] = qpow(fac[N], maxd - 2);
  for (i = N - 1; i >= 1; i--) invfac[i] = (invfac[i + 1] * (i + 1)) % maxd;
  mpow[0] = 1;
  npow[0] = 1;
  for (i = 1; i <= N; i++) {
    mpow[i] = (mpow[i - 1] * m) % maxd;
    npow[i] = (npow[i - 1] * n) % maxd;
  }
}
int main() {
  n = read();
  m = read();
  a = read();
  b = read();
  int i;
  init();
  long long ans = 0;
  for (i = 1; i < n; i++) {
    long long tmp = 1;
    tmp = ((A(n - 2, i - 1) * C(m - 1, i - 1)) % maxd * mpow[n - i - 1]) % maxd;
    if (i != n - 1) tmp = ((tmp * (i + 1)) % maxd * npow[n - i - 2]) % maxd;
    ans = (ans + tmp) % maxd;
  }
  printf("%lld", ans);
  return 0;
}
