#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
const ll MOD=998244353;
int n, k;
vector<int> g[100010];
vector<ll> dp[2][100010];
bool used[100010];
void dfs(int x){
    used[x]=1;
    dp[0][x].resize(1);
    dp[1][x].resize(2);
    dp[0][x][0]=dp[1][x][1]=1;
    for(auto y:g[x]){
        if(used[y]) continue;
        dfs(y);
        vector<ll> v(2*k+1), w(2*k+1);
        for(int i=0; i<dp[0][x].size(); i++){
            for(int j=0; j<dp[0][y].size(); j++){
                (v[i+j]+=dp[0][x][i]*dp[0][y][j])%=MOD;
            }
            for(int j=1; j<dp[1][y].size(); j++){
                (v[i+j]+=dp[0][x][i]*dp[1][y][j])%=MOD;
            }
        }
        for(int i=1; i<dp[1][x].size(); i++){
            for(int j=0; j<dp[0][y].size(); j++){
                (w[i+j]+=dp[1][x][i]*dp[0][y][j])%=MOD;
            }
            for(int j=1; j<dp[1][y].size(); j++){
                (w[i+j]+=dp[1][x][i]*dp[1][y][j])%=MOD;
                (w[i+j-1]+=dp[1][x][i]*dp[1][y][j])%=MOD;
            }
        }
        while(v.size()>k+1 || v.back()==0) v.pop_back();
        while(w.size()>k+1 || w.back()==0) w.pop_back();
        dp[0][x]=v;
        dp[1][x]=w;
    }
}
int main()
{
    cin>>n>>k;
    for(int i=0; i<n-1; i++){
        int x, y; cin>>x>>y;
        x--; y--;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(0);
    ll ans=dp[1][0][k];
    if(dp[0][0].size()>=k+1) (ans+=dp[0][0][k])%=MOD;
    cout<<ans<<endl;
    return 0;
}
