#include <bits/stdc++.h>
using namespace std;
int an[101][21][21], n, k, md = 1e9 + 7, t[21][21];
vector<int> tr[101];
void go(int v = 1, int p = 0) {
  an[v][0][1] = an[v][1][0] = 1;
  for (int i = 0; i < (int)(tr[v].size()); ++i) {
    int u = tr[v][i];
    if (u == p) continue;
    go(u, v);
    for (int i = 0; i < (int)(21); ++i)
      for (int j = 0; j < (int)(21); ++j)
        for (int w = 0; w < (int)(21); ++w)
          for (int z = 0; z < (int)(21); ++z) {
            int a = i;
            if (w && (w + 1 < a || !a)) a = w + 1;
            if (a > 20) a = 0;
            int b = 0;
            if (!i && z)
              b = z + 1;
            else if (i && z && k - i + 1 < z)
              b = z + 1;
            if (!w)
              b = max(b, j);
            else if (j && k - w + 1 < j)
              b = max(b, j);
            if (b > 20) continue;
            t[a][b] = ((long long)an[v][i][j] * an[u][w][z] + t[a][b]) % md;
          }
    for (int i = 0; i < (int)(21); ++i)
      for (int j = 0; j < (int)(21); ++j) an[v][i][j] = t[i][j], t[i][j] = 0;
  }
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i < (int)(n); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    tr[a].push_back(b);
    tr[b].push_back(a);
  }
  go();
  int a = 0;
  for (int i = 0; i < (int)(21); ++i)
    if ((a += an[1][i][0]) >= md) a -= md;
  printf("%d\n", a);
}
