#include <bits/stdc++.h>
#define MOD 998244353
using namespace std;
int dp[5005][5005];

int n, k;
vector<int> adj[5005];
int exp(long long a, long long b){
    if(b==0) return 1;
    long long temp = exp(a, b/2);
    temp *= temp;
    temp %= MOD;
    if(b%2) temp *= a;
    temp %= MOD;
    return temp;
}
int mult(long long a, long long b){
    return ((a*b)%MOD);
}
int divv(long long a, long long b){
    return mult(a, exp(b, MOD - 2));
}
int sub(long long a, long long b){
    return ((a-b+MOD)%MOD);
}
int add(long long a, long long b){
    return (a+b)%MOD;
}
int get(int j, int z){
    if(z<0) return 0;
    int tomult = dp[j][k];
    if(z > 0) tomult += dp[j][z-1];
    tomult %= MOD;
    return tomult;
}
void dfs(int i, int p){
    int x = 0;
    for(int j: adj[i]){
        if(j==p) continue;
        x++;
        dfs(j, i);
    }
    for(int z = 0;z<=k;z++){
        int a = (z>0), b = (z==0);
        int other = min(k - z, z);
        for(int j: adj[i]){
            if(j==p) continue;
            int c, d;
            c = mult(a, get(j, min(other, z - 1)));
            d = mult(a, sub(get(j, z), get(j, z-1)));
            d = add(d, mult(b, get(j, min(other, z - 1))));
            if(other == z) d = add(d, mult(b, get(j, z) - get(j, z-1)));
            a = c;
            b = d;
        }
        dp[i][z] = b;
    }
    for(int z = 1;z<=k;z++){
        dp[i][z] = add(dp[i][z], dp[i][z-1]);
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>k;
    for(int i = 1;i<n;i++){
        int u, v;
        cin>>u>>v;
        u--;
        v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(0, 0);
    cout<<dp[0][k]<<'\n';
}