#include <bits/stdc++.h>
using namespace std;
const long long Mo = 1000000007LL;
long long f[110][23][23], js[2][23][23], ans;
int n, m, e, fst[110], fa[110];
struct str {
  int v, nex;
} edge[220];
void add(long long &x, long long y) {
  x += y;
  x %= Mo;
}
void make_edge(int a, int b) {
  edge[++e].nex = fst[a];
  fst[a] = e;
  edge[e].v = b;
  edge[++e].nex = fst[b];
  fst[b] = e;
  edge[e].v = a;
}
void dfs(int u) {
  for (int i = fst[u]; i; i = edge[i].nex) {
    int v = edge[i].v;
    if (fa[u] == v) continue;
    fa[v] = u;
    dfs(v);
  }
  memset(js, 0, sizeof(js));
  js[0][0][m + 1] = 1;
  int o = 1;
  for (int i = fst[u]; i; i = edge[i].nex) {
    int v = edge[i].v;
    memset(js[o], 0, sizeof(js[o]));
    if (fa[u] == v) continue;
    for (int x1 = 0; x1 <= m; x1++)
      for (int y1 = 0; y1 <= m + 1; y1++)
        for (int x2 = 0; x2 <= m; x2++)
          for (int y2 = 0; y2 <= m + 1; y2++) {
            int a = max(x1, x2), b = min(y1, y2);
            if (a + b <= m)
              add(js[o][0][b], js[o ^ 1][x1][y1] * f[v][x2][y2]);
            else
              add(js[o][a][b], js[o ^ 1][x1][y1] * f[v][x2][y2]);
          }
    o ^= 1;
  }
  o ^= 1;
  for (int x = 1; x <= m; x++)
    for (int y = 1; y <= m + 1; y++) {
      add(f[u][x + 1][min(y + 1, m + 1)], js[o][x][y]);
      if (x <= m)
        add(f[u][0][1], js[o][x][y]);
      else
        add(f[u][x + 1][1], js[o][x][y]);
    }
  for (int y = 1; y <= m + 1; y++) {
    if (y <= m)
      add(f[u][0][min(y + 1, m + 1)], js[o][0][y]);
    else
      add(f[u][1][min(y + 1, m + 1)], js[o][0][y]);
    add(f[u][0][1], js[o][0][y]);
  }
  return;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    make_edge(a, b);
  }
  dfs(1);
  for (int i = 1; i <= m + 1; i++) add(ans, f[1][0][i]);
  cout << ans << endl;
  return 0;
}
