← Home
package main

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

const MOD int64 = 1000000007

var fact []int64
var invFact []int64

func power(base, exp int64) int64 {
	var 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 nCr(n, r int) int64 {
	if r < 0 || r > n {
		return 0
	}
	return fact[n] * invFact[r] % MOD * invFact[n-r] % MOD
}

func mul(A, B []int64, k int) []int64 {
	degA := len(A) - 1
	degB := len(B) - 1
	degC := degA + degB
	if degC > k {
		degC = k
	}
	C := make([]int64, degC+1)
	for i := 0; i <= degA; i++ {
		if A[i] == 0 {
			continue
		}
		for j := 0; j <= degB; j++ {
			if i+j <= k {
				C[i+j] = (C[i+j] + A[i]*B[j]) % MOD
			}
		}
	}
	return C
}

func add(A, B []int64) []int64 {
	degA := len(A) - 1
	degB := len(B) - 1
	degC := degA
	if degB > degC {
		degC = degB
	}
	C := make([]int64, degC+1)
	for i := 0; i <= degC; i++ {
		if i <= degA {
			C[i] += A[i]
		}
		if i <= degB {
			C[i] += B[i]
		}
		C[i] %= MOD
	}
	return C
}

func getShiftedBinom(m, k int) []int64 {
	deg := m + 1
	if deg > k {
		deg = k
	}
	res := make([]int64, deg+1)
	for j := 0; j <= k-1 && j <= m; j++ {
		res[j+1] = nCr(m, j)
	}
	return res
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 1024*1024)
	scanner.Split(bufio.ScanWords)

	scanInt := func() int {
		scanner.Scan()
		res, _ := strconv.Atoi(scanner.Text())
		return res
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	k := scanInt()

	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		u := scanInt()
		v := scanInt()
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	maxVal := n
	if k > n {
		maxVal = k
	}
	fact = make([]int64, maxVal+1)
	invFact = make([]int64, maxVal+1)
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= maxVal; i++ {
		fact[i] = fact[i-1] * int64(i) % MOD
	}
	invFact[maxVal] = power(fact[maxVal], MOD-2)
	for i := maxVal - 1; i >= 1; i-- {
		invFact[i] = invFact[i+1] * int64(i+1) % MOD
	}

	P := make([][]int64, n+1)
	size := make([]int, n+1)

	var dfs func(u, p int)
	dfs = func(u, p int) {
		size[u] = 1
		P[u] = []int64{2}
		for _, v := range adj[u] {
			if v == p {
				continue
			}
			dfs(v, u)
			size[u] += size[v]

			term := add(getShiftedBinom(size[v]-1, k), P[v])
			P[u] = mul(P[u], term, k)
		}
	}
	dfs(1, 0)

	R := make([]int64, len(P[1]))
	copy(R, P[1])

	for i := 2; i <= n; i++ {
		term1 := P[i]
		m := n - size[i] - 1
		term2 := getShiftedBinom(m, k)
		prod := mul(term1, term2, k)
		R = add(R, prod)
	}

	if len(R) < k+1 {
		newR := make([]int64, k+1)
		copy(newR, R)
		R = newR
	}

	V := make([]int64, k+1)
	for j := 0; j <= k; j++ {
		T_j := R[j]
		sub := nCr(n-1, j) * int64(j+1) % MOD
		V[j] = (T_j - sub + MOD) % MOD
	}

	c := make([]int64, k+1)
	for j := 0; j <= k; j++ {
		var sum int64 = 0
		for i := 0; i <= j; i++ {
			val := int64(n - 1 - i)
			val = (val%MOD + MOD) % MOD
			term := nCr(j, i) * power(val, int64(k)) % MOD
			if (j-i)%2 == 1 {
				sum = (sum - term + MOD) % MOD
			} else {
				sum = (sum + term) % MOD
			}
		}
		c[j] = sum
	}

	var ans int64 = 0
	for j := 0; j <= k; j++ {
		ans = (ans + c[j]*V[j]) % MOD
	}

	fmt.Println(ans)
}