#include <bits/stdc++.h> using namespace std; constexpr int md = 1e9 + 7; inline void mad (int &a, int b) { a += b; if (a >= md) a -= md; } inline int mul (int a, int b) { return (int)((long long)a * b % md); } auto convolution ( vector<int> a, vector<int> b ) -> vector<int> { int l = a.size(); int m = b.size(); int n = l + m - 1; assert(l && m); vector<int> c(n, 0); for (int i = 0; i < l; i++) { for (int j = 0; j < m; j++) { mad(c[i + j], mul(a[i], b[j])); } } return c; } void dfs ( vector<vector<int>>& grh, vector<int>& sz, vector<vector<int>>& dp, int crr = 0, int prt = 0 ) { for (const int nxt : grh[crr]) if (nxt != prt) { dfs(grh, sz, dp, nxt, crr); sz[crr] += sz[nxt]; } dp[crr] = {1}; for (const int nxt : grh[crr]) if (nxt != prt) { dp[crr] = convolution(dp[crr], dp[nxt]); } dp[crr].push_back(1); } int main() { int n, k; cin >> n >> k; vector<vector<int>> grh(n); for (int i = 0; i < n - 1; i++) { int s, t; cin >> s >> t; grh[s].push_back(t); grh[t].push_back(s); } vector<int> sz(n, 1); vector<vector<int>> dp(n); dfs(grh, sz, dp); cout << dp[0][k] << endl; return 0; }