#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);   }   