#include<bits/stdc++.h>

using namespace std;

#define fr(i, n) for(ll i = 0; i < n; i++)
#define frr(i, n) for(ll i = 1; i <= n; i++)
#define frm(i, n) for(ll i = n-1; i >= 0; i--)

#define pb push_back
#define f first
#define s second

typedef long long ll;
typedef pair<ll,ll> pii;
typedef vector<vector<ll>> matrix;

#define mem(v, k) memset(v, k, sizeof(v));
#define db cout << "Debug" << endl;
#define all(x) begin(x), end(x)
#define dbg(x)  cout << #x << " = " << x << endl
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)

#define mp make_pair
#define pq priority_queue

#define mx(a, b) a = max(a, b);
#define mod(a, b) a = a%b;

#define MAXN 5010
#define MOD 998244353
#define MAXL 30
#define ROOT 1
#define INF 1000000000000000100

ll dp[MAXN][MAXN];
ll n, k;

ll sum[3][MAXN];

vector<ll> adj[MAXN];

void dfs(ll v, ll p){
	dp[v][0] = 1;

	for(auto x : adj[v]){
		if(x != p){
			dfs(x, v);

			sum[0][0] = dp[v][0];
			frr(i, k) sum[0][i] = (sum[0][i-1] + dp[v][i])%MOD;

			sum[1][0] = dp[x][0];
			frr(i, k) sum[1][i] = (sum[1][i-1] + dp[x][i])%MOD;

			sum[2][0] = (dp[v][0]*sum[1][k])%MOD;

			frr(i, k){
				sum[2][i] = 0;	
				
				/*Nova subarvore se sobresai*/
				sum[2][i] = (sum[2][i] + dp[x][i-1]*sum[0][min(i, k - i)])%MOD;
				/*Velha subarvore se sobrasai*/
				if(i < k) sum[2][i] = (sum[2][i] + dp[v][i]*sum[1][min(i - 1, k - i - 1)])%MOD;

				if(2*i <= k) sum[2][i] = (sum[2][i] - (dp[v][i]*dp[x][i-1])%MOD + MOD)%MOD;
				/*N usa a nova arvore*/
				sum[2][i] = (sum[2][i] + dp[v][i]*sum[1][k])%MOD; 
			}


			fr(i, k+1){
				dp[v][i] = sum[2][i];
			}
			
			/*
			cout << v << endl;
			fr(i, k+1) cout << dp[v][i] << ' ';
			cout << endl;
			*/
			
		}
	}
}

int main(){
	fastio;
	cin >> n >> k;
	fr(i, n-1){
		ll u, v;
		cin >> u >> v;
		adj[u].pb(v);
		adj[v].pb(u);
	}

	if(k == 0){
		cout << 1 << endl;
		return 0;
	}

	dfs(1, -1);
	ll ans = 0;
	fr(i, k+1) {
		ans = (ans + dp[1][i])%MOD;
	}
	cout << ans << endl;
}
