#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const long long MOD = (long long)1e9 + 7;
long long add(long long x, long long y) {
  x += y;
  if (x >= MOD) return x - MOD;
  return x;
}
long long sub(long long x, long long y) {
  x -= y;
  if (x < 0) return x + MOD;
  return x;
}
long long mult(long long x, long long y) { return (x * y) % MOD; }
const int N = (int)1e6 + 7;
long long f[N], rf[N];
long long pw1[N], pw2[N];
int n, m;
int main() {
  rf[0] = rf[1] = 1;
  for (long long x = 2; x < N; x++) rf[x] = sub(0, mult(MOD / x, rf[MOD % x]));
  for (int i = 2; i < N; i++) rf[i] = mult(rf[i - 1], rf[i]);
  f[0] = 1;
  for (int i = 1; i < N; i++) f[i] = mult(f[i - 1], i);
  scanf("%d%d", &n, &m);
  pw1[0] = pw2[0] = 1;
  for (int i = 1; i < N; i++) {
    pw1[i] = mult(pw1[i - 1], n);
    pw2[i] = mult(pw2[i - 1], m);
  }
  long long ans = 0;
  for (int k = 1; k < n - 1 && k <= m; k++) {
    long long cur = k + 1;
    cur = mult(cur, pw1[n - k - 2]);
    cur = mult(cur, f[n - 2]);
    cur = mult(cur, rf[n - k - 1]);
    cur = mult(cur, f[m - 1]);
    cur = mult(cur, rf[k - 1]);
    cur = mult(cur, rf[m - k]);
    cur = mult(cur, pw2[n - 1 - k]);
    ans = add(ans, cur);
  }
  if (n - 1 <= m) {
    long long cur = f[n - 2];
    cur = mult(cur, f[m - 1]);
    cur = mult(cur, rf[n - 2]);
    cur = mult(cur, rf[m - n + 1]);
    ans = add(ans, cur);
  }
  printf("%lld\n", ans);
  return 0;
}
