#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, p = 1e9 + 7;
long long fpow(long long a, long long b) {
  long long ans = 1;
  for (; b; b >>= 1, a = a * a % p)
    if (b & 1) ans = ans * a % p;
  return ans;
}
long long kdm[N], m, k, n, jc[N], inv[N], ans = 0;
long long P(long long a, long long b) { return jc[b] * inv[b - a] % p; }
void mzh(long long x) {
  long long ret = 1, tmp, d, e;
  if (2 * n > x) {
    if (x - n > k) return;
    ret = fpow(k, 2 * n - x);
    d = (x - n) * P(x - n - 1, k - 1) % p;
    tmp = d * P(x - n, k) % p * 2;
    tmp = (tmp - d * d % p) % p;
    ans = (ans + ret * tmp % p) % p;
  } else {
    if (n > k - x + 2 * n || x - 2 * n > k) return;
    ret = P(x - 2 * n, k) * (k - x + 2 * n) % p;
    d = P(n - 1, k - x + 2 * n - 1);
    e = P(n - 2, k - x + 2 * n - 2) * (n - 1) % p;
    tmp = e * 2 * d % p - e * e % p;
    tmp = tmp * (k - x + 2 * n - 1) % p + d * d % p;
    ans = (ans + ret * tmp % p) % p;
  }
}
int main() {
  scanf("%lld%lld", &k, &n);
  m = n + k;
  kdm[0] = 1;
  for (int i = 1; i <= k; i++) kdm[i] = kdm[i - 1] * k % p;
  jc[0] = 1;
  for (int i = 1; i <= k; i++) jc[i] = jc[i - 1] * i % p;
  inv[k] = fpow(jc[k], p - 2);
  for (int i = k - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % p;
  for (int i = n + 1; i <= m; i++) {
    mzh(i);
  }
  printf("%lld", (ans % p + p) % p);
}
