#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
template <class T>
using vec = vector<T>;
template <class T>
using v2d = vector<vector<T>>;
template <class T>
using v3d = vector<vector<vector<T>>>;
template <class T>
using v4d = vector<vector<vector<vector<T>>>>;
template <class T>
using prq = priority_queue<T>;
template <class T>
using rpq = priority_queue<T, vector<T>, greater<T>>;
const int MOD = 1e9 + 7;
ll mpow(ll a, ll b, const int m = MOD) {
  if (!b) {
    return 1;
  }
  if (b & 1) {
    return (a * mpow(a, b ^ 1, m)) % m;
  }
  ll x = mpow(a, b >> 1, m);
  return (x * x) % m;
}
const int MAX = 1e6 + 1;
ll fact[MAX];
ll inv(ll x) { return mpow(x, MOD - 2); }
void init() {
  fact[0] = 1;
  for (int i = 1; i < MAX; ++i) {
    fact[i] = (fact[i - 1] * i) % MOD;
  }
}
ll cayley(int n, int k) {
  if (n - k - 1 < 0) {
    return 1;
  }
  return (k * mpow(n, n - k - 1)) % MOD;
}
ll comb(int n, int k) {
  if (k > n) {
    return 0;
  }
  return (fact[n] * inv((fact[n - k] * fact[k]) % MOD)) % MOD;
}
ll perm(int n, int k) {
  if (k > n) {
    return 0;
  }
  return (fact[n] * inv(fact[k])) % MOD;
}
int main() {
  init();
  int n, m;
  scanf("%d %d %*d %*d", &n, &m);
  ll ans = 0;
  for (int i = 1; i < n; ++i) {
    int nodes = i + 1;
    int edges = i;
    int rem_edges = n - 1 - edges;
    ll res = 1;
    res = (res * comb(m - 1, edges - 1));
    ;
    res = (res * comb(n - 2, nodes - 2)) % MOD;
    res = (res * fact[nodes - 2]) % MOD;
    ;
    res = (res * mpow(m, rem_edges)) % MOD;
    ;
    res = (res * cayley(n, nodes)) % MOD;
    ;
    ans = (ans + res) % MOD;
  }
  printf("%lld\n", ans);
}
