func_code_string: #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;   }   