#include <bits/stdc++.h>
using namespace std;
constexpr int MAXWHITE = 20;
constexpr int MINBLACK = 40;
int64_t dp[110][MAXWHITE + 5][MINBLACK + 5];
int vis[110];
int par[110];
vector<vector<int>> adj;
int N, K;
int64_t MOD = (int64_t)1e9 + 7LL;
int64_t Get(int u, int max_white, int min_black) {
  return dp[u][max_white + 1][min_black + 1];
}
void Set(int u, int max_white, int min_black, int64_t val) {
  dp[u][max_white + 1][min_black + 1] = val;
}
void ClearTemp() {
  for (int i = 0; i <= MAXWHITE + 1; ++i) {
    for (int j = 0; j <= MINBLACK + 1; ++j) {
      dp[109][i][j] = 0;
    }
  }
}
void SetTemp(int max_white, int min_black, int64_t val) {
  Set(109, max_white, min_black, val);
}
int64_t GetTemp(int max_white, int min_black) {
  return Get(109, max_white, min_black);
}
void Flush(int u) {
  for (int i = 0; i <= MAXWHITE + 1; ++i) {
    for (int j = 0; j <= MINBLACK + 1; ++j) {
      dp[u][i][j] = dp[109][i][j];
    }
  }
  ClearTemp();
}
void Update(int u) {
  int first_one = true;
  for (int i = 0; i < adj[u].size(); ++i) {
    int v = adj[u][i];
    if (par[u] == v) continue;
    if (first_one) {
      first_one = false;
      for (int a = -1; a <= MAXWHITE; ++a) {
        for (int b = -1; b <= MINBLACK; ++b) {
          if (a == b && b == -1) continue;
          if (a == -1) {
            Set(u, (b + 1 <= K ? a : a + 1), b + 1, Get(v, a, b));
          } else if (b == -1) {
            Set(u, a + 1, b, Get(v, a, b));
          } else {
            Set(u, a + 1, b + 1, Get(v, a, b));
          }
        }
      }
      int64_t black_way = 0;
      for (int a = -1; a <= MAXWHITE; ++a) {
        if (a + 1 > K) continue;
        for (int b = -1; b <= MINBLACK; ++b) {
          black_way += Get(v, a, b);
          black_way %= MOD;
        }
      }
      Set(u, -1, 0, black_way);
      continue;
    }
    for (int a = -1; a <= MAXWHITE; ++a) {
      for (int b = -1; b <= MINBLACK; ++b) {
        if (a == b && b == -1) continue;
        for (int c = -1; c <= MAXWHITE; ++c) {
          for (int d = -1; d <= MINBLACK; ++d) {
            if (c == d && d == -1) continue;
            int max_white = (a == -1 ? c + 1 : (c == -1 ? a : max(a, c + 1)));
            int min_black = (b == -1 ? d + 1 : (d == -1 ? b : min(b, d + 1)));
            if (a == c && c == -1) {
              max_white = -1;
            }
            if (b == d && d == -1) {
              min_black = -1;
            }
            if (max_white != -1 && min_black != -1) {
              if (min_black + max_white <= K) {
                max_white = -1;
              }
            }
            if (max_white <= MAXWHITE && min_black <= MINBLACK) {
              int64_t x = Get(u, a, b);
              int64_t y = Get(v, c, d);
              x = (x * y) % MOD;
              x = (x + GetTemp(max_white, min_black)) % MOD;
              SetTemp(max_white, min_black, x);
            }
          }
        }
      }
    }
    Flush(u);
  }
}
void Dfs(int u) {
  vis[u] = 1;
  bool leaf = true;
  for (int i = 0; i < adj[u].size(); ++i) {
    int v = adj[u][i];
    if (!vis[v]) {
      leaf = false;
      par[v] = u;
      Dfs(v);
    }
  }
  if (leaf) {
    Set(u, -1, 0, 1);
    Set(u, 0, -1, 1);
    return;
  }
  Update(u);
}
int main() {
  scanf("%d%d", &N, &K);
  int u, v;
  adj.resize(N);
  for (int i = 0; i < N - 1; ++i) {
    scanf("%d%d", &u, &v);
    --u;
    --v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  Dfs(0);
  int64_t ans = 0;
  for (int max_white = -1; max_white <= MAXWHITE; ++max_white) {
    for (int min_black = -1; min_black <= MINBLACK; ++min_black) {
      if ((max_white == -1 && min_black <= K) ||
          (min_black != -1 && min_black + max_white <= K)) {
        ans += Get(0, max_white, min_black);
        ans %= MOD;
      }
    }
  }
  cout << ans << endl;
  return 0;
}
