#include <bits/stdc++.h>
using namespace std;

#define fr(i,n) for(int i = 0; i<n; i++)
#define sz(v) (int)(v.size())
#define prin(a) cout << #a << " = " << a << endl
#define prinv(v) cout << #v << " = "; for(auto it : v) cout << it << ", "; cout << endl
#define all(v) (v).begin(),(v).end()

typedef long long ll;

#define rmin(a,b) a = min<ll>(a,b)
#define rmax(a,b) a = max<ll>(a,b)

#define fi first
#define se second

template <class T>
T fp(T x, long long e) {
	T ans(1);
	for(; e > 0; e /= 2) {
		if(e & 1) ans = ans * x;
		x = x * x;
	}
	return ans;
}

const ll mod = 998244353;
struct mb {
	mb(int v = 0) : val(v < 0 ? v + mod : v) {}
	mb(ll v){ val = (v%mod+mod)%mod; }
	int val;
 
	void operator += (mb o) { *this = *this + o; }
	void operator -= (mb o) { *this = *this - o; }
	void operator *= (mb o) { *this = *this * o; }
	mb operator * (mb o) { return (int)((long long) val * o.val % mod); }
	//mb operator / (mb o) { return *this * fp(o, mod - 2); }
	//bool operator == (mb o) { return val==o.val; } //usar soh para hashes
	mb operator + (mb o) { return val + o.val >= mod ? val + o.val - mod : val + o.val; }
	mb operator - (mb o) { return val - o.val < 0 ? val - o.val + mod : val - o.val; }
};

const int N = 5e3+10;
mb dp[N][N];
int tam[N];
vector<int> g[N];
ll n, k;

void dfs(int no, int from){
	dp[no][0] = 1;
	tam[no] = 1;
	for(auto &it : g[no]){
		if(it==from) continue;
		dfs(it,no);
		int ta = tam[no];
		tam[no]+=tam[it]; //tirar daqui e por depois
		rmin(tam[no],k+1);
		
		vector<mb> ndp(tam[no]);
		//fr(i,tam[no]) ndp[i] = dp[no][i];
		fr(i,ta){
			fr(j,tam[it]){
				if(dp[no][i].val==0) continue;
				if(dp[it][j].val==0) continue;
				ndp[i]+=dp[it][j]*dp[no][i];
				if(i+j+1<=k){
					assert(i+j+1<tam[no]);
					ndp[max<int>(i,j+1)]+=dp[it][j]*dp[no][i];
				}
			}
		}
		fr(i,tam[no]) dp[no][i] = ndp[i];
	}
}

int main(){
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> k;
	fr(i,n-1){
		int a, b; cin >> a >> b; a--,b--;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	
	dfs(0,-1);
	
	/*fr(no,n){
		cout << "no = " << no+1 << " -> ";
		fr(kk,k+1){
			cout << dp[no][kk].val << " ";
		}
		cout << endl;
	}*/
	
	mb ans = 0;
	fr(i,k+1) ans += dp[0][i];
	cout << ans.val << "\n";
}
