#include <bits/stdc++.h>
#define N 5001
#define MOD 998244353
using namespace std;
int n, k;
int dp[N][N], ans, sum[N][N], size[N], pre[N], suf[N];
vector<int> edge[N];

int add(int x, int y) {
	return (x + y) % MOD;
}
int sub(int x, int y) {
	return (x - y + MOD) % MOD;
}
int mul(int x, int y) {
	return 1LL * x * y % MOD;
}

void dfs(int u, int f) {
	size[u] = 1;
	for (int v: edge[u]) if (v != f) { 
		dfs(v, u);
		size[u] += size[v];
	}
	
	
	dp[u][0] = 1;
	for (int v: edge[u]) if (v != f) 
		dp[u][0] = mul(dp[u][0], sum[v][k]);

//	printf("dp[%d][%d] = %d\n", u, 0, dp[u][0]);
	sum[u][0] = dp[u][0];

	for (int i = 1; i < size[u] && (i << 1) <= k; ++i) {
		int tmp1 = 1, tmp2 = 1;
		for (int v: edge[u]) if (v != f) {
			tmp1 = mul(tmp1, sum[v][k] + sum[v][i - 1]);
			tmp2 = mul(tmp2, sum[v][k] + sum[v][i - 2]);
		}
		dp[u][i] = sub(tmp1, tmp2);
		sum[u][i] = add(sum[u][i - 1], dp[u][i]);
//		printf("dp[%d][%d] = %d\n", u, i, dp[u][i]);
	}
	
	for (int i = (k >> 1) + 1; i < size[u] && i <= k; ++i) {
		pre[0] = suf[edge[u].size() + 1] = 1;
		dp[u][i] = 0;
		for (int j = 0; j < edge[u].size(); ++j)
			pre[j + 1] = mul(pre[j], edge[u][j] == f ? 1 : add(sum[edge[u][j]][k], sum[edge[u][j]][k - i - 1]));
		for (int j = edge[u].size() - 1; j >= 0; --j)
			suf[j + 1] = mul(suf[j + 2], edge[u][j] == f ? 1 : add(sum[edge[u][j]][k], sum[edge[u][j]][k - i - 1]));
		for (int j = 0; j < edge[u].size(); ++j) if (edge[u][j] != f) {
			int v = edge[u][j];
			dp[u][i] = add(dp[u][i], mul(mul(dp[v][i - 1], pre[j]), suf[j + 2]));
		}
		sum[u][i] = add(sum[u][i - 1], dp[u][i]);
	}
	for (int i = size[u]; i <= k; ++i) sum[u][i] = sum[u][i - 1];
}

int main() {
	scanf("%d%d", &n, &k);
	for (int i = 1; i < n; ++i) {
		int u, v;
		scanf("%d%d", &u, &v);
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	
	dfs(1, 0);
	int ans = 0;
	for (int i = 0; i <= k; ++i) ans = add(ans, dp[1][i]);
	printf("%d\n", ans);
	return 0;
}

