#include <bits/stdc++.h>
using namespace std;
long long p = 1000000007;
long long power(long long x, long long y) {
  if (y == 0) {
    return (long long)1;
  } else {
    long long z = power(x, y / 2);
    return y % 2 == 0 ? z * z % p : z * z % p * x % p;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  map<long long, vector<long long>> powers;
  vector<long long> div((size_t)1e6 + 1, 1);
  for (long long i = 2; i <= (long long)1e6; ++i) {
    div[i] = (p - (p / i) * div[p % i] % p) % p;
  }
  auto power_div = [&](long long x, long long y) {
    return y >= 0 ? powers[x][y] : div[powers[x][-y]];
  };
  vector<long long> factorial((size_t)1e6 + 1, 1),
      factorial_div((size_t)1e6 + 1, 1);
  for (long long i = 1; i <= 1e6; i++) {
    factorial[i] = factorial[i - 1] * i % p;
    factorial_div[i] = factorial_div[i - 1] * div[i] % p;
  }
  auto binomial = [&](long long x, long long y) {
    return x < 0 || y < 0 || x < y
               ? (long long)0
               : factorial[x] * factorial_div[y] % p * factorial_div[x - y] % p;
  };
  long long n, m;
  cin >> n >> m;
  for (long long i : {n, m}) {
    powers[i].assign((long long)1e6, 1);
    for (long long j = 1; j < 1e6; j++) {
      powers[i][j] = powers[i][j - 1] * i % p;
    }
  }
  long long o = 0;
  for (long long k = 1; k < n; k++) {
    o += binomial(m - 1, k - 1) * binomial(n - 2, k - 1) % p *
         factorial[k - 1] % p * (k + 1) % p * power_div(n, n - (k + 1) - 1) %
         p * powers[m][n - k - 1] % p;
    o %= p;
  }
  cout << o << endl;
  return 0;
}
