← Home
#include <bits/stdc++.h>
 
using namespace std;
 
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
 
using vi = vector<int>;
using ii = pair<int, int>;
using vii = vector<ii>;
using ll = long long;
using ld = long double;
using vll = vector<ll>;
using vb = vector<bool>;
using pll = pair<ll, ll>;
using i128 = __int128;
 
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
 
#define pb push_back
#define eb emplace_back
 
#define fst first
#define snd second
 
const int MOD = 998'244'353;
 
int mul(int a, int b) {
    return int(1LL * a * b % MOD);
}
 
void add(int &x, int v) {
    if ((x += v) >= MOD) x -= MOD;
}
 
void sub(int &x, int v) {
    if ((x -= v) < 0) x += MOD;
}
 
vi mul(const vi &a, const vi &b) {
    const int &n = sz(a);
    vi c(n, 0);
    int prefA = 0, prefB = 0;
    int prev = 0;
    forn(maxi, n) {
        add(prefA, a[maxi]);
        add(prefB, b[maxi]);
        int curr = mul(prefA, prefB);
        c[maxi] = curr; sub(c[maxi], prev);
        prev = curr;
    }
    return c;
}
 
vi dfs(int u, const vector<vi> &adj, const int &k, int p = -1) {
    const int n = sz(adj);
    vector<vi> dpChilds;
    for (int v : adj[u]) if (v != p) {
        dpChilds.pb(dfs(v, adj, k, u));
    }
    const int m = sz(dpChilds);
    if (m == 0) {
        vi dp(k + 1);
        dp[0] = 1;
        if (k >= 1) dp[1] = 1;
        return dp;
    }
    vector<vi> suff(m + 1);
    suff[m] = vi(k + 1, 0);
    suff[m][0] = 1;
    dforn(i, m) suff[i] = mul(suff[i + 1], dpChilds[i]);
    vi dp(k + 2, 0);
    vi pref = vi(k + 1, 0);
    pref[0] = 1;
    forn(i, m) {
        forn(j, k) add(pref[j + 1], pref[j]);
        forn(j, k) add(suff[i + 1][j + 1], suff[i + 1][j]);
        forn(maxi, k + 1) {
            int left = min(k - maxi, maxi - 1);
            int right = min(k - maxi, maxi);
            int leftValue = left == -1 ? (i == 0 ? 1 : 0) : pref[left];
            int rightValue = suff[i + 1][right];
            int curr = mul(dpChilds[i][maxi], mul(leftValue, rightValue));
            add(dp[maxi + 1], curr);
        }
        suff[i + 1].clear();
        dforn(j, k) sub(pref[j + 1], pref[j]);
        pref = mul(pref, dpChilds[i]);
        dpChilds[i].clear();
    }
    if (p != -1) {
        int total = 0;
        forn(i, k + 2) add(total, dp[i]);
        add(dp[0], total);
        dp.pop_back();
    }
    return dp;
}
 
int main() {
    ios::sync_with_stdio(0);                
    cin.tie(0); cout.tie(0);
    
    int n, k;
    cin >> n >> k;
    
    vector<vi> adj(n);
    forn(i, n - 1) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    
    vi ret = dfs(0, adj, k);
    int s = 0;
    forn(i, k + 2) add(s, ret[i]);
    cout << s << '\n';
    
    return 0;
}