#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define siz(x) (int)(x.size())
#define all(x) x.begin(), x.end()
#define debug_arr(x,len) for(int _=1; _<=len; _++) cout<<x[_]<<" "; cout<<'\n';
#define debug(x) cout<<'\n'<<#x<<": "<<x<<'\n';
const int maxN = 2e5+5;
int n, k, sz[maxN], cnt[maxN], mx_depth = 0, ans = 0, tree[maxN];
bool del[maxN];
vector<int>adj[maxN];
void dfs(int u, int v)
{
sz[u] = 1;
for(auto i: adj[u])
{
if(i == v || del[i]) continue;
dfs(i, u);
sz[u] += sz[i];
}
}
int find_centroid(int u, int v, int total)
{
for(auto i: adj[u])
{
if(i == v || del[i]) continue;
if(sz[i] > total/2) return find_centroid(i, u, total);
}
return u;
}
void update(int u, int v, int layer, int type)
{
if(layer > k) return;
mx_depth = max(mx_depth, layer);
if(type == 1) cnt[layer]++;
else ans += cnt[k-layer];
for(auto i: adj[u])
{
if(i == v || del[i]) continue;
update(i, u, layer+1, type);
}
}
void cal(int u)
{
dfs(u, 0);
int root = find_centroid(u, 0, sz[u]);
mx_depth = 0; cnt[0] = 1; del[root] = 1;
for(auto i: adj[root])
{
if(del[i]) continue;
update(i, root, 1, 0);
update(i, root, 1, 1);
}
fill(cnt+1, cnt+mx_depth+1, 0);
for(auto i: adj[root])
{
if(del[i]) continue;
cal(i);
}
}
int32_t main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>n>>k;
for(int i=1; i<n; i+=1)
{
int x,y; cin>>x>>y;
adj[x].push_back(y);
adj[y].push_back(x);
}
dfs(1, 0);
cal(1);
cout<<ans<<'\n';
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBzaXooeCkgKGludCkoeC5zaXplKCkpCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lIGRlYnVnX2Fycih4LGxlbikgZm9yKGludCBfPTE7IF88PWxlbjsgXysrKSBjb3V0PDx4W19dPDwiICI7IGNvdXQ8PCdcbic7CiNkZWZpbmUgZGVidWcoeCkgY291dDw8J1xuJzw8I3g8PCI6ICI8PHg8PCdcbic7CmNvbnN0IGludCBtYXhOICA9IDJlNSs1OwoKaW50IG4sIGssIHN6W21heE5dLCBjbnRbbWF4Tl0sIG14X2RlcHRoID0gMCwgYW5zID0gMCwgdHJlZVttYXhOXTsKYm9vbCBkZWxbbWF4Tl07CnZlY3RvcjxpbnQ+YWRqW21heE5dOwoKdm9pZCBkZnMoaW50IHUsIGludCB2KQp7Cglzelt1XSA9IDE7Cglmb3IoYXV0byBpOiBhZGpbdV0pCgl7CgkJaWYoaSA9PSB2IHx8IGRlbFtpXSkgY29udGludWU7CgkJZGZzKGksIHUpOwoJCXN6W3VdICs9IHN6W2ldOwoJfQp9CgppbnQgZmluZF9jZW50cm9pZChpbnQgdSwgaW50IHYsIGludCB0b3RhbCkKewoJZm9yKGF1dG8gaTogYWRqW3VdKQoJewoJCWlmKGkgPT0gdiB8fCBkZWxbaV0pIGNvbnRpbnVlOwoJCWlmKHN6W2ldID4gdG90YWwvMikgcmV0dXJuIGZpbmRfY2VudHJvaWQoaSwgdSwgdG90YWwpOwoJfQoJcmV0dXJuIHU7Cn0KCnZvaWQgdXBkYXRlKGludCB1LCBpbnQgdiwgaW50IGxheWVyLCBpbnQgdHlwZSkKewoJaWYobGF5ZXIgPiBrKSByZXR1cm47CglteF9kZXB0aCA9IG1heChteF9kZXB0aCwgbGF5ZXIpOwoJaWYodHlwZSA9PSAxKSBjbnRbbGF5ZXJdKys7CgllbHNlIGFucyArPSBjbnRbay1sYXllcl07Cglmb3IoYXV0byBpOiBhZGpbdV0pCgl7CgkJaWYoaSA9PSB2IHx8IGRlbFtpXSkgY29udGludWU7CgkJdXBkYXRlKGksIHUsIGxheWVyKzEsIHR5cGUpOwoJfQp9Cgp2b2lkIGNhbChpbnQgdSkKewoJZGZzKHUsIDApOwoJaW50IHJvb3QgPSBmaW5kX2NlbnRyb2lkKHUsIDAsIHN6W3VdKTsKCW14X2RlcHRoID0gMDsgY250WzBdID0gMTsgZGVsW3Jvb3RdID0gMTsKCWZvcihhdXRvIGk6IGFkaltyb290XSkKCXsKCQlpZihkZWxbaV0pIGNvbnRpbnVlOwoJCXVwZGF0ZShpLCByb290LCAxLCAwKTsKCQl1cGRhdGUoaSwgcm9vdCwgMSwgMSk7Cgl9CglmaWxsKGNudCsxLCBjbnQrbXhfZGVwdGgrMSwgMCk7Cglmb3IoYXV0byBpOiBhZGpbcm9vdF0pCgl7CgkJaWYoZGVsW2ldKSBjb250aW51ZTsKCQljYWwoaSk7Cgl9Cn0KaW50MzJfdCBtYWluKCkKewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsKCWNpbj4+bj4+azsKCWZvcihpbnQgaT0xOyBpPG47IGkrPTEpCgl7CgkJaW50IHgseTsgY2luPj54Pj55OwoJCWFkalt4XS5wdXNoX2JhY2soeSk7CgkJYWRqW3ldLnB1c2hfYmFjayh4KTsKCX0KCWRmcygxLCAwKTsKCWNhbCgxKTsKCWNvdXQ8PGFuczw8J1xuJzsKfSA=