← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD = 1000000007

var fact, invFact [2005]int64

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func precompute() {
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= 2000; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[2000] = power(fact[2000], MOD-2)
	for i := 1999; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}
}

func nCr(n, r int) int64 {
	if r < 0 || r > n {
		return 0
	}
	num := fact[n]
	den := (invFact[r] * invFact[n-r]) % MOD
	return (num * den) % MOD
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	precompute()
	reader := bufio.NewReader(os.Stdin)
	var N, M, R int
	if _, err := fmt.Fscanf(reader, "%d %d %d\n", &N, &M, &R); err != nil {
		return
	}

	X := make([]int, N)
	Y := make([]int, N)
	B := make([]int64, N)

	var P [1005][1005]int

	for i := 0; i < N; i++ {
		fmt.Fscanf(reader, "%d %d %d\n", &X[i], &Y[i], &B[i])
		B[i] %= MOD
		P[X[i]][Y[i]]++
	}

	for i := 1; i <= 1000; i++ {
		for j := 1; j <= 1000; j++ {
			P[i][j] = P[i][j] + P[i-1][j] + P[i][j-1] - P[i-1][j-1]
		}
	}

	query := func(x1, y1, x2, y2 int) int {
		x1 = max(1, x1)
		y1 = max(1, y1)
		x2 = min(1000, x2)
		y2 = min(1000, y2)
		if x1 > x2 || y1 > y2 {
			return 0
		}
		return P[x2][y2] - P[x1-1][y2] - P[x2][y1-1] + P[x1-1][y1-1]
	}

	Nj := make([]int, N)
	var S int64 = 0
	var S1 int64 = 0

	for i := 0; i < N; i++ {
		Nj[i] = query(X[i]-R, Y[i]-R, X[i]+R, Y[i]+R)
		S = (S + B[i]) % MOD
		S1 = (S1 + B[i]*nCr(N-Nj[i], M)) % MOD
	}

	ans := (nCr(N, M) * ((S * S) % MOD)) % MOD
	sub := (2 * S) % MOD
	sub = (sub * S1) % MOD
	ans = (ans - sub + MOD) % MOD

	var lastTerm int64 = 0
	for j := 0; j < N; j++ {
		for k := 0; k < N; k++ {
			xmin := max(X[j], X[k]) - R
			xmax := min(X[j], X[k]) + R
			ymin := max(Y[j], Y[k]) - R
			ymax := min(Y[j], Y[k]) + R

			Njk := query(xmin, ymin, xmax, ymax)
			N_union := Nj[j] + Nj[k] - Njk

			term := (B[j] * B[k]) % MOD
			term = (term * nCr(N-N_union, M)) % MOD
			lastTerm = (lastTerm + term) % MOD
		}
	}

	ans = (ans + lastTerm) % MOD
	fmt.Println(ans)
}