#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
vector<long long> sil(1000001);
long long Pot(long long p, long long w) {
  if (w == 0) return 1;
  if (w % 2 == 0) {
    long long pol = Pot(p, w / 2);
    return pol * pol % MOD;
  }
  return Pot(p, w - 1) * p % MOD;
}
long long Inv(long long n) { return Pot(n, MOD - 2); }
long long C(long long n, long long k) {
  return sil[n] * Inv(sil[n - k] * sil[k] % MOD) % MOD;
}
int main() {
  ios_base::sync_with_stdio(0);
  sil[0] = 1;
  for (long long i = 1; i < 1000001; ++i) sil[i] = (sil[i - 1] * i) % MOD;
  long long k, w;
  cin >> k >> w;
  long long odp = 0;
  for (long long t = 1; t <= k; ++t) {
    if (t <= w - 1) {
      long long x = C(k, t) * sil[t] % MOD;
      x = x * x % MOD;
      x = x * t % MOD;
      x = x * Pot(k, w - t - 1) % MOD;
      x = 2 * x % MOD;
      odp = (odp + x) % MOD;
      long long y = 0;
      if (t == w - 1) {
        y = C(k - 1, t - 1) * sil[t - 1] % MOD;
        y = y * t % MOD;
        y = y * y % MOD;
        y = y * k % MOD;
      } else {
        y = C(k, t) * sil[t] % MOD;
        y = y * t % MOD;
        y = y * y % MOD;
        y = y * Pot(k, w - t - 2) % MOD;
      }
      odp -= y;
      if (odp < 0) odp += MOD;
    } else {
      long long x = C(k, t) * sil[t] % MOD;
      x = x * w % MOD;
      x = x * C(k - t + w - 1, w - 1) % MOD;
      x = x * sil[w - 1] % MOD;
      x = 2 * x % MOD;
      odp = (odp + x) % MOD;
      long long y = (w - 1) * (w - 1) % MOD;
      y = y * C(k - t + w - 2, w - 2) % MOD;
      y = y * sil[w - 2] % MOD;
      y = (y + C(k - t + w - 1, w - 1) * sil[w - 1]) % MOD;
      y = y * C(k, t) % MOD;
      y = y * sil[t] % MOD;
      odp -= y;
      if (odp < 0) odp += MOD;
    }
  }
  cout << odp;
  return 0;
}
