#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
long long modpow(long long x, long long n, long long m) {
  if (n == 0) return 1 % m;
  long long u = modpow(x, n / 2, m);
  u = (u * u) % m;
  if (n % 2 == 1) u = (u * x) % m;
  return u;
}
vector<long long> nfact, nfactInv;
long long ncr(long long n, long long r, int N = 1000000) {
  if (!nfact.size()) {
    nfact.resize(N + 1);
    nfact[0] = 1;
    for (int i = 1; i <= N; i++) {
      nfact[i] = nfact[i - 1] * i;
      nfact[i] %= MOD;
    }
    nfactInv.resize(N + 1);
    nfactInv[N] = modpow(nfact[N], MOD - 2, MOD);
    for (int i = N - 1; i >= 0; i--) {
      nfactInv[i] = nfactInv[i + 1] * (i + 1);
      nfactInv[i] %= MOD;
    }
  }
  if (r > n || r < 0) return 0;
  long long d1 = nfactInv[r];
  long long d2 = nfactInv[n - r];
  long long mult = (d1 * d2) % MOD;
  return (nfact[n] * mult) % MOD;
}
long long npr(long long n, long long r, int N = 1000000) {
  if (!nfact.size()) {
    nfact.resize(N + 1);
    nfact[0] = 1;
    for (int i = 1; i <= N; i++) {
      nfact[i] = nfact[i - 1] * i;
      nfact[i] %= MOD;
    }
    nfactInv.resize(N + 1);
    nfactInv[N] = modpow(nfact[N], MOD - 2, MOD);
    for (int i = N - 1; i >= 0; i--) {
      nfactInv[i] = nfactInv[i + 1] * (i + 1);
      nfactInv[i] %= MOD;
    }
  }
  if (r > n || r < 0) return 0;
  return (nfact[n] * nfactInv[n - r]) % MOD;
}
long long f(long long n, long long s) {
  if (n - s - 1 < 0) return s * modpow(n, MOD - 2, MOD) % MOD;
  return s * modpow(n, n - s - 1, MOD) % MOD;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long n, m;
  cin >> n >> m;
  long long ans = 0;
  for (int edges = 1; edges < n; edges++) {
    long long val = ncr(m - 1, edges - 1);
    val *= npr(n - 2, edges - 1);
    val %= MOD;
    val *= modpow(m, n - edges - 1, MOD);
    val %= MOD;
    val *= f(n, edges + 1);
    val %= MOD;
    ans += val;
    ans %= MOD;
  }
  cout << ans;
  return 0;
}
