#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const int maxn = 100010;
const int INF = ~0U >> 1;
const double eps = 1e-9;
void getint(int &ret) {
  char ch;
  while (ch = getchar(), ch < '0' || ch > '9')
    ;
  ret = ch - '0';
  while (ch = getchar(), ch >= '0' && ch <= '9') ret = ret * 10 + ch - '0';
}
const int maxN = 210;
const int maxK = 42;
int nxt[maxN * 2], first[maxN], to[maxN * 2], vis[maxN], tot;
void add_edge(int x, int y) {
  nxt[++tot] = first[x];
  first[x] = tot;
  to[tot] = y;
}
int dp[maxN][maxK * 2];
int f[maxK * 2][maxK * 2], g[maxK * 2][maxK * 2];
vector<int> son[maxN];
int n, k;
void dfs(int x) {
  vis[x] = 1;
  for (int i = first[x]; i; i = nxt[i])
    if (!vis[to[i]]) {
      son[x].push_back(to[i]);
      dfs(to[i]);
    }
  if (son[x].empty()) {
    dp[x][1 + k] = 1;
    dp[x][-k + k] = 1;
    return;
  }
  memset(f, 0, sizeof(f));
  for (int i = -k; i <= k; i++) {
    f[i + k][i + k] = (f[i + k][i + k] + dp[son[x][0]][i + k]) % mod;
  }
  for (int kt = 1; kt < son[x].size(); kt++) {
    int Son = son[x][kt];
    memset(g, 0, sizeof(g));
    for (int Min = -k; Min <= k; Min++)
      for (int Max = Min; Max <= k; Max++) {
        if (f[Min + k][Max + k]) {
          for (int L = -k; L <= k; L++) {
            long long tmp = dp[Son][L + k];
            g[min(Min, L) + k][max(Max, L) + k] =
                (g[min(Min, L) + k][max(Max, L) + k] +
                 1ll * f[Min + k][Max + k] * tmp % mod) %
                mod;
          }
        }
      }
    for (int Min = -k; Min <= k; Min++)
      for (int Max = Min; Max <= k; Max++)
        f[Min + k][Max + k] = g[Min + k][Max + k];
  }
  for (int Min = -k; Min <= k; Min++)
    for (int Max = Min; Max <= k; Max++) {
      if (Min < k) {
        if (Max + Min + 1 <= 0)
          dp[x][Min + 1 + k] = (dp[x][Min + 1 + k] + f[Min + k][Max + k]) % mod;
        else if (Max < k)
          dp[x][Max + 1 + k] = (dp[x][Max + 1 + k] + f[Min + k][Max + k]) % mod;
      }
      dp[x][-k + k] = (dp[x][-k + k] + f[Min + k][Max + k]) % mod;
    }
}
int main() {
  cin >> n >> k;
  if (k == 0) {
    puts("1");
    return 0;
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add_edge(x, y);
    add_edge(y, x);
  }
  int ans = 0;
  dfs(1);
  for (int i = -k; i <= 0; i++) ans = (ans + dp[1][i + k]) % mod;
  cout << ans;
  return 0;
}
