#include <bits/stdc++.h>
inline int getint() {
  register char ch;
  while (!isdigit(ch = getchar()))
    ;
  register int x = ch ^ '0';
  while (isdigit(ch = getchar())) x = (((x << 2) + x) << 1) + (ch ^ '0');
  return x;
}
const int N = 101, K = 41, mod = 1e9 + 7;
int k, f[N][K], tmp[K];
std::forward_list<int> e[N];
inline void add_edge(const int &u, const int &v) {
  e[u].push_front(v);
  e[v].push_front(u);
}
void dfs(const int &x, const int &par) {
  f[x][0] = f[x][k + 1] = 1;
  for (int &y : e[x]) {
    if (y == par) continue;
    dfs(y, x);
    std::fill(&tmp[0], &tmp[k * 2] + 1, 0);
    for (register int i = 0; i <= k * 2; i++) {
      for (register int j = 0; j <= k * 2; j++) {
        (tmp[i + j <= k * 2 ? std::min(i, j + 1) : std::max(i, j + 1)] +=
         (long long)f[x][i] * f[y][j] % mod) %= mod;
      }
    }
    std::copy(&tmp[0], &tmp[k * 2] + 1, f[x]);
  }
}
int main() {
  const int n = getint();
  k = getint();
  for (register int i = 1; i < n; i++) {
    add_edge(getint(), getint());
  }
  dfs(1, 0);
  int ans = 0;
  for (register int i = 0; i <= k; i++) {
    (ans += f[1][i]) %= mod;
  }
  printf("%d\n", ans);
  return 0;
}
