#include <bits/stdc++.h>
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define f first
#define s second
#define pb push_back
#define mp make_pair
// #define int long long
using namespace std;
typedef long long ll;
ll gcd (ll a, ll b) { while (b) { a %= b,swap(a, b);}return a;}
typedef pair<int, int> pii;
const int mod = (998244353LL);
void print(vector<int> &w){for(int i =0; i < sz(w); i++){if(i == sz(w) - 1) cout<<w[i]<<"\n";else cout<<w[i]<<" ";}}
///CUIDADO COM MAXN
#define N 5010

int n, k, sz[N];
vector<int> grafo[N];

int dp[N][N];
void solve(int x, int p){
	dp[x][0]=1;
	sz[x] = 1;
	for(auto v: grafo[x]){
		if(v==p)continue;
		solve(v, x);
		vector<int> curr(k + 1);
		int M1 = min(k, sz[x]), M2 = min(k, sz[v]);
		for(int i = 0; i <= M1; i++){
			for(int j = 0; j <= M2; j++){
				int y = max(i,j+1);
				curr[i] = (curr[i] + 1LL*dp[x][i]*dp[v][j])%mod; // corta aresta (x, v)
				if(i+j<=k-1)curr[y] = (curr[y] + 1LL*dp[x][i]*dp[v][j])%mod; // mege subtrees em maior distancia do filho pra mim
			}
		}
		sz[x] += sz[v];
		for(int i =0;i<=min(k, sz[x]);i++)dp[x][i]=curr[i];
	}
}
int32_t main(){
	ios::sync_with_stdio(false); cin.tie(0);
	cin>>n>>k;
	for(int i = 1, a, b; i < n; i++){
		cin>>a>>b;
		grafo[a].pb(b);
		grafo[b].pb(a);
	}
	solve(1,1);
	ll ans = 0;
	for(int i=0;i<=k;i++)ans+=dp[1][i];
	cout<<ans%mod<<"\n";
}
