#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define mpr make_pair
#define dingyi int mid = l + r >> 1, ls = p << 1, rs = p << 1 | 1
#define y0 y_csyakioi_0
#define y1 y_csyakioi_1
#define rep(i, x, y) for(int i = x; i <= y; ++i)
#define per(i, x, y) for(int i = x; i >= y; --i)
#define repg(i, u) for(int i = head[u]; i; i = e[i].nxt)
inline int read(){
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); }
	while(ch >= '0' && ch <= '9'){ x = x * 10 + (ch ^ 48); ch = getchar(); }
	return x * f;
}
const int N = 5010, mod = 998244353;
struct edge{
	int v, nxt;
}e[N << 1];
int head[N], cnt, n, k, x, y, ans, dep[N], md[N], f[N][N], g[N];
inline void add(int u, int v){
	e[++cnt].v = v;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}
inline void dfs(int u, int fa){
	md[u] = dep[u] = dep[fa] + 1; f[u][0] = 1;
	repg(i, u){
		int v = e[i].v; if(v == fa) continue;
		dep[v] = dep[u] + 1; dfs(v, u);
		rep(i, 0, max(md[u], md[v]) - dep[u]) g[i] = 0;
		rep(i, 0, md[u] - dep[u]){
			rep(j, 0, md[v] - dep[u]){
				g[i] = (g[i] + 1ll * f[u][i] * f[v][j] % mod) % mod;
				if(i + j < k) g[max(i, j + 1)] = (g[max(i, j + 1)] + 1ll * f[u][i] * f[v][j] % mod) % mod;
			}
		}
		md[u] = max(md[u], md[v]); rep(i, 0, md[u] - dep[u]) f[u][i] = g[i];
	}
}
inline void mian(){
	n = read(); k = read();
	rep(i, 1, n - 1){
		x = read(); y = read();
		add(x, y); add(y, x);
	}
	dfs(1, 0);rep(i, 0, k) ans = (ans + f[1][i]) % mod; printf("%d\n", ans); 
}
int main(){ int qwq = 1; while(qwq--) mian(); return 0; }