/** I can do this all day **/

#pragma GCC optimize("O2")
#include <bits/stdc++.h>
using namespace std;

typedef long long                   ll;
typedef long double                 ld;
typedef pair<int,int>               pii;
typedef pair<ll,ll>                 pll;
#define all(x)                      (x).begin(),(x).end()
#define F                           first
#define S                           second
#define Mp                          make_pair
#define SZ(x)			    		(int)x.size()
#define fast_io                     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io                     freopen("in.txt" , "r+" , stdin) ; freopen("out.txt" , "w+" , stdout);

const int N = 5e3 + 10;
const ll mod2 = 1e9 + 7;
const ll mod = 998244353;
const ll inf = 8e18;
const int LOG = 22;

ll pw(ll a , ll b, ll M)  { return (!b ? 1 : (b & 1 ? (a * pw(a * a % M, b / 2, M)) % M : pw(a * a % M, b / 2, M))); }

int n, k, sub[N];

int dp[N][N];

vector < int > G[N];

void dfs(int v, int P)
{
	vector < int > cu(N);
	sub[v] = 1;
	dp[v][0] = 1;
	for(auto u : G[v])
	{
		if(u == P) continue;
		dfs(u, v);
		for(int i = 0; i < N; i ++) cu[i] = 0;
		for(int i = 0; i <= sub[v]; i ++)
		{
			for(int j = 0; j <= sub[u]; j ++)
			{
				if(j > k || i > k) continue;
				cu[i] = (cu[i] + 1ll * dp[v][i] * dp[u][j] % mod) % mod; /// v - u hazf beshe
				if(i + j + 1 > k || j + 1 > k) continue;
				cu[max(i, j + 1)] = (cu[max(i, j + 1)] + 1ll * dp[v][i] * dp[u][j] % mod) % mod;
			}
		}
		for(int i = 0; i < N; i ++) dp[v][i] = cu[i];
		sub[v] += sub[u];
	}
	/*printf("v = %d\n", v);
	for(int i = 0; i <= n; i ++)
	{
		printf("%lld ", dp[v][i]);
	}
	printf("\n");*/
}


int main()
{
	scanf("%d%d", &n, &k);
	for(int i = 1; i < n; i ++)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	dfs(1, 0);
	ll tot = 0;
	for(int i = 0; i <= k; i ++) tot = (tot + dp[1][i]) % mod;
	printf("%lld", tot);
    return 0;
}

/** test corner cases(n = 1?) watch for overflow or minus indices **/

