#include <bits/stdc++.h>
using namespace std;
const int MAXN = 110;
const int MOD = 1e9 + 7;
long long n, k, dp[MAXN][MAXN][MAXN], local[MAXN][MAXN];
vector<int> adj[MAXN];
void add(long long& v, long long u) { v = (v + u) % MOD; }
void dfs(int v, int par = -1) {
  dp[v][1][0] = dp[v][0][1] = 1;
  for (auto i : adj[v]) {
    if (i == par) continue;
    dfs(i, v);
    for (int w = 0; w < 23; w++)
      for (int j = 0; j < 50; j++) {
        local[w][j] = dp[v][w][j];
        dp[v][w][j] = 0;
      }
    for (int a = 0; a <= (k + 1); a++)
      for (int b = 0; b <= (2 * k + 1); b++)
        for (int c = 0; c <= (k + 1); c++)
          for (int d = 0; d <= (2 * k + 1); d++) {
            int locala = 0;
            if (!d) locala = b;
            if (!b && d) locala = d + 1;
            if (b && d) locala = min(b, d + 1);
            int localb = a;
            if (localb && locala) {
              if ((localb - 1 + locala - 1) <= k) localb = 0;
            }
            int localc = c;
            if (localc) localc++;
            if (localc && locala) {
              if ((locala - 1 + localc - 1) <= k) localc = 0;
            }
            int locald = 0;
            if (!localc) locald = localb;
            if (!localb && localc) locald = localc;
            if (localb && localc) locald = max(localc, localb);
            if (locald <= (k + 1) && locala <= (2 * k + 3))
              add(dp[v][locald][locala], local[a][b] * dp[i][c][d] % MOD);
          }
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> k;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1);
  long long answer = 0;
  for (int i = 0; i <= (2 * k + 3); i++) answer = (answer + dp[1][0][i]) % MOD;
  cout << answer << endl;
  return 0;
}
