#include<bits/stdc++.h>
#define N 5001
#define M 5001
#define R register
#define mod 998244353
#define INFI 0x7fffffff
#define INFL 0x7fffffffffffffff
#define F(i,start,end) for(R int (i)=(start);(i)<=(end);i++)
#define T(i,end,start) for(R int (i)=(start);(i)>=(end);i--)
using namespace std;
template<typename T> void read(T &x)
{
	int f=1;
	x=0;
	char c=getchar();
	while(!isdigit(c))
	{
		if(c=='-')
			f=-1;
		c=getchar();
	}
	while(isdigit(c))
	{
		x=x*10+c-'0';
		c=getchar();
	}
	x*=f;
	return;
}
void write(long long x)
{
	if(x<0)
	{
		x=~x+1;
		putchar('-');
 	}
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
	return;
}
int n,lim,cnt;
long long ans,g[N];
struct edge
{
	int v,next;
}e[N<<1];
struct node
{
	int head,mx,dep;
	long long f[N];
}tree[N];
void add_edge(int u,int v)
{
	e[++cnt]=(edge){v,tree[u].head};
	tree[u].head=cnt;
	e[++cnt]=(edge){u,tree[v].head};
	tree[v].head=cnt;
	return;
}
void dfs(int u)
{
	tree[u].mx=tree[u].dep;
	tree[u].f[0]=1;
	for(int i=tree[u].head;i;i=e[i].next)
	{
		int v=e[i].v;
		if(!tree[v].dep)
		{
			tree[v].dep=tree[u].dep+1;
			dfs(v);
			F(j,0,max(tree[u].mx,tree[v].mx)-tree[u].dep)
				g[j]=0;
			F(j,0,tree[u].mx-tree[u].dep)
				F(k,0,tree[v].mx-tree[u].dep)
				{
					g[j]=(g[j]+1ll*tree[u].f[j]*tree[v].f[k]%mod)%mod;
					if(j+k+1>lim)
						continue;
					g[max(j,k+1)]=(g[max(j,k+1)]+1ll*tree[u].f[j]*tree[v].f[k]%mod)%mod;
				}
			tree[u].mx=max(tree[u].mx,tree[v].mx);
			F(j,0,tree[u].mx-tree[u].dep)
				tree[u].f[j]=g[j];
		}
	}
	return;
}
int main()
{
	read(n),read(lim);
	F(i,2,n)
	{
		int u,v;
		read(u),read(v);
		add_edge(u,v);
	}
	tree[1].dep=1;
	dfs(1);
	F(i,0,lim)
		ans=(ans+tree[1].f[i])%mod;
	write(ans);
 	return 0;
}