#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int MOD = 998244353;
const int MAX = 5005;
int n, k;
vector<int> edges[MAX];
int dp[MAX][MAX];

int add(int x, int y) {
    int sol = x + y;
    if (sol > MOD) sol -= MOD;
    else if (sol < 0) sol += MOD;
    return sol;
}

int mul(int x, int y) {
    return x * 1ll * y % MOD;
}

int dfs(int a, int prev) {
    int h1 = 0;
    dp[a][0] = 1;
    for (auto b : edges[a]) {
        if (b == prev) continue;
        int h2 = dfs(b, a);
        vector<int> temp(max(h1 + 1, h2 + 2));
        for (int i = 0; i <= h1; i++) {
            for (int j = 0; j <= h2; j++) {
                if (i + j + 1 <= k) {
                    temp[max(i, j + 1)] = add(temp[max(i, j + 1)], mul(dp[a][i], dp[b][j]));
                }
                if (i <= k && j <= k) {
                    temp[i] = add(temp[i], mul(dp[a][i], dp[b][j]));
                }
            }
        }

        for (int i = 0; i < temp.size(); i++) {
            dp[a][i] = temp[i];
        }

        h1 = max(h1, h2 + 1);
    }

    return h1;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int a, b;
    cin >> n >> k;

    for (int i = 0; i < n - 1; i++) {
        cin >> a >> b;
        edges[a].push_back(b);
        edges[b].push_back(a);
    }

    dfs(1, 0);

    int sol = 0;
    for (int i = 0; i <= k; i++) {
        sol = add(sol, dp[1][i]);
    }

    cout << sol << "\n";

    return 0;
}


