#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
mt19937 mt_rand(time(0));
const int N = 1e6 + 5;
const long long MOD = 1e9 + 7, M = 1e9 + 5;
int n, m, a, b;
long long potm[N], potn[N];
long long pot(long long &a, long long p) {
  if (p == 0) return 1;
  long long w = pot(a, p / 2);
  w = w * w % MOD;
  if (p % 2) w = w * a % MOD;
  return w;
}
long long frac[N];
long long dwum(long long n, long long k) {
  if (n < k) return 0;
  long long ans = frac[n];
  ans = ans * pot(frac[k], M) % MOD;
  ans = ans * pot(frac[n - k], M) % MOD;
  return ans;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &a, &b);
  long long ans = 0;
  frac[0] = 1;
  potm[0] = 1;
  potn[0] = 1;
  for (int i = 1; i <= n; i++) potm[i] = potm[i - 1] * (long long)m % MOD;
  for (int i = 1; i <= n; i++) potn[i] = potn[i - 1] * (long long)n % MOD;
  for (int i = 1; i <= max(n, m); i++)
    frac[i] = frac[i - 1] * (long long)i % MOD;
  long long n2 = n - 2;
  long long m2 = m - 1;
  for (int i = 0; i <= n - 2; i++) {
    long long tmp = dwum(n2, i);
    tmp = tmp * frac[i] % MOD;
    tmp = tmp * dwum(m2, i) % MOD;
    tmp = tmp * potm[n - 2 - i] % MOD;
    if (i != n - 2) {
      tmp = tmp * (long long)(i + 2) % MOD;
      tmp = tmp * potn[n - i - 3] % MOD;
    }
    ans += tmp;
  }
  ans %= MOD;
  printf("%lld", ans);
  return 0;
}
