#include <bits/stdc++.h>
using namespace std;
constexpr long long MAX_M = 1001005;
constexpr long long MOD = 1000000007;
long long fact[MAX_M];
long long mod_pow(long long b, long long p) {
  long long out = 1;
  while (p > 0) {
    if (p & 1) {
      out = (out * b) % MOD;
    }
    p >>= 1;
    b = (b * b) % MOD;
  }
  return out;
}
long long mod_inv(long long a) { return mod_pow(a, MOD - 2); }
long long mod_choose(long long n, long long k) {
  long long cur = fact[n];
  cur = (cur * mod_inv(fact[n - k])) % MOD;
  cur = (cur * mod_inv(fact[k])) % MOD;
  return cur;
}
int main() {
  long long n, m, a, b;
  cin >> n >> m >> a >> b;
  long long cur_fact = 1;
  fact[0] = 1;
  for (int i = 1; i < MAX_M; i++) {
    cur_fact = (cur_fact * i) % MOD;
    fact[i] = cur_fact;
  }
  long long tot = 0;
  int max_edges = min(n - 1, m);
  for (int k = 1; k <= max_edges; k++) {
    long long num_path_weights = mod_choose(m - 1, k - 1);
    long long num_trees_with_leftover_vertices =
        ((k + 1) * mod_pow(n, n - k - 2)) % MOD;
    if (k + 1 == n) num_trees_with_leftover_vertices = 1;
    long long choose_vertices_in_between = mod_choose(n - 2, k - 1);
    long long reorder_vertices_in_between = fact[k - 1];
    long long extra_edge_multiplier = mod_pow(m, n - k - 1);
    long long result =
        (num_path_weights * num_trees_with_leftover_vertices) % MOD;
    result = (result * reorder_vertices_in_between) % MOD;
    result = (result * choose_vertices_in_between) % MOD;
    result = (result * extra_edge_multiplier) % MOD;
    tot = (tot + result) % MOD;
  }
  cout << tot;
  return 0;
}
