#include <bits/stdc++.h>
using namespace std;
const int MOD(1000000007);
const int Max_W(1000050);
inline int Mult(const int &a, const int &b) { return (a * 1LL) * b % MOD; }
constexpr int Add(int a, int b) { return a + b >= MOD ? a + b - MOD : a + b; }
constexpr int Sub(int a, int b) { return a - b < 0 ? a - b + MOD : a - b; }
void exgcd(const int &a, const int &b, int &x, int &y) {
  if (b == 0)
    x = 1, y = 0;
  else
    exgcd(b, a % b, y, x), y -= x * (a / b);
}
inline int inverse(const int &a) {
  int invx, invy;
  exgcd(a, MOD, invx, invy);
  return (invx % MOD + MOD) % MOD;
}
int power(int a, int n) {
  int Ret(1);
  while (n) {
    if (n & 1) Ret = Mult(Ret, a);
    a = Mult(a, a), n >>= 1;
  }
  return Ret;
}
int W, A[Max_W], Fac[Max_W], Inv[Max_W];
inline int P(const int &n, const int &m) {
  return (0 <= m && m <= n) ? Mult(Fac[n], Inv[n - m]) : 0;
}
int work(const int &N) {
  int Ans(0);
  if (W == 1)
    Ans = N;
  else
    Ans = Mult(Sub(power(W, N + 1), W), inverse(Sub(W, 1)));
  for (int len = N + 1; len - N <= W; ++len)
    if (len - N < N + 1)
      Ans =
          Add(Ans, Mult(Mult(A[len - N], A[len - N]), power(W, N - (len - N))));
    else
      Ans = Add(Ans, Mult(A[len - N], P(W - ((len - N) - (N + 1) + 1), N)));
  return Ans;
}
int main() {
  int N;
  scanf("%d%d", &W, &N);
  A[0] = 1;
  for (int i = 1; i <= W; ++i) A[i] = Mult(A[i - 1], W - i + 1);
  Fac[0] = 1;
  for (int i = 1; i <= W; ++i) Fac[i] = Mult(Fac[i - 1], i);
  Inv[W] = inverse(Fac[W]);
  for (int i = W - 1; i >= 0; --i) Inv[i] = Mult(Inv[i + 1], i + 1);
  printf("%d", Sub(work(N), work(N - 1)));
  return 0;
}
