```go
package main
import (
"bufio"
"fmt"
"os"
)
const MOD int64 = 1000000007
func modPow(a, e int64) int64 {
res := int64(1)
for e > 0 {
if e&1 == 1 {
res = res * a % MOD
}
a = a * a % MOD
e >>= 1
}
return res
}
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
var k int
var w int64
fmt.Fscan(in, &k, &w)
fact := make([]int64, k+1)
invFact := make([]int64, k+1)
fact[0] = 1
for i := 1; i <= k; i++ {
fact[i] = fact[i-1] * int64(i) % MOD
}
invFact[k] = modPow(fact[k], MOD-2)
for i := k; i >= 1; i-- {
invFact[i-1] = invFact[i] * int64(i) % MOD
}
perm := func(a, b int) int64 {
if b < 0 || b > a {
return 0
}
return fact[a] * invFact[a-b] % MOD
}
K := int64(k) % MOD
invK := modPow(K, MOD-2)
invK2 := invK * invK % MOD
powWR := modPow(K, w-1)
ans := int64(0)
for r := 1; r <= k; r++ {
var d, e int64
if int64(r) <= w {
p := perm(k, r)
d = p * p % MOD * powWR % MOD
} else {
ww := int(w)
o := r - ww
po := perm(k, o)
pw := perm(k-o, ww)
d = po * pw % MOD * pw % MOD
}
if r < k {
if int64(r) <= w-2 {
p := perm(k, r+1)
e = p * p % MOD * powWR % MOD * invK2 % MOD
} else if int64(r) >= w-1 {
ww1 := int(w - 1)
o := r - ww1 + 1
po := perm(k, o)
pw := perm(k-o, ww1)
e = po * pw % MOD * pw % MOD
}
}
ans += d - e
ans %= MOD
powWR = powWR * invK % MOD
}
if ans < 0 {
ans += MOD
}
fmt.Fprintln(out, ans)
}
```