#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;
mt19937_64 mt_rand(chrono::system_clock::now().time_since_epoch().count());
template <typename T1, typename T2>
inline bool upmax(T1& a, T2 b) {
  return (a < b ? (a = b, true) : false);
}
template <typename T1, typename T2>
inline bool upmin(T1& a, T2 b) {
  return (b < a ? (a = b, true) : false);
}
const int maxn = (int)2e6 + 10;
const int maxlog = 21;
const int base = (int)1e9 + 7;
const long double eps = (long double)1e-9;
const long double PI = acos(-1.);
const int pp = 41;
const int INF = (int)2e9;
const long long llinf = (long long)1e18;
int n, m, a, b;
long long fact[maxn];
long long inv[maxn];
long long stepN[maxn];
long long stepM[maxn];
long long bp(long long a, int n) {
  long long res = 1;
  while (n) {
    if (n & 1) res = (1ll * res * a) % base;
    a = 1ll * a * a % base;
    n >>= 1;
  }
  return res;
}
void prec() {
  fact[0] = 1;
  for (int i = 1; i < maxn; i++) {
    fact[i] = 1ll * fact[i - 1] * i % base;
  }
  inv[maxn - 1] = bp(fact[maxn - 1], base - 2);
  for (int i = maxn - 2; i >= 0; i--) {
    inv[i] = 1ll * inv[i + 1] * (i + 1) % base;
  }
}
long long getC(int n, int k) {
  if (k > n) return 0;
  return 1ll * fact[n] * inv[n - k] % base * inv[k] % base;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  prec();
  cin >> n >> m >> a >> b;
  stepN[0] = stepM[0] = 1;
  for (int i = 1; i < maxn; i++) {
    stepN[i] = 1ll * stepN[i - 1] * n % base;
    stepM[i] = 1ll * stepM[i - 1] * m % base;
  }
  long long res = 0;
  for (int i = 0; i <= n - 2; i++) {
    long long add = 1ll * getC(n - 2, i) * fact[i] % base;
    long long cnt = getC(m - 1, i);
    add = 1ll * add * cnt % base;
    long long x = n - i - 2;
    if (x != 0) {
      long long cntG = 1ll * stepN[x - 1] * (n - x) % base;
      cntG = 1ll * cntG * stepM[x] % base;
      add = 1ll * add * cntG % base;
    }
    res = (res + add) % base;
  }
  cout << res << '\n';
  return 0;
}
