module main; // https://mayokoex.hatenablog.com/entry/2015/05/03/122625 より // 木DP、深さ優先探索 import std; int N, K; int[][] G; immutable MOD = 1_000_000_007L; long[] dfs(int v, int p) { long[] ret = [1L]; foreach (next; G[v]) { if (next == p) continue; long[] tmp = dfs(next, v); int n = ret.length.to!int; int m = tmp.length.to!int; auto nret = new long[](n + m - 1); foreach (i; 0 .. n) foreach (j; 0 .. m) { (nret[i + j] += ret[i] * tmp[j]) %= MOD; } ret = nret; } ret ~= 1; return ret; } void main() { // 入力 readln.chomp.formattedRead("%d %d", N, K); G = new int[][](N); foreach (_; 0 .. N - 1) { int a, b; readln.chomp.formattedRead("%d %d", a, b); G[a] ~= b; G[b] ~= a; } // 答えの計算と出力 writeln(dfs(0, -1)[K]); }