#include <iostream> // Input/output stream objects
#include <fstream> // File stream objects
#include <sstream> // String stream objects
#include <iomanip> // Input/output manipulators
#include <string> // String class and functions
#include <vector> // Dynamic array
#include <list> // Doubly linked list
#include <set> // Set container
#include <map> // Map container
#include <queue> // Queue container
#include <stack> // Stack container
#include <algorithm> // Algorithms on sequences (e.g., sort, find)
#include <cmath> // Mathematical functions
#include <ctime> // Date and time functions
#include <cstdlib> // General purpose functions (e.g., memory management)
#include <cstring> // C-style string functions
#include <cctype> // Character classification functions
#include <cassert> // Assert function for debugging
#include <exception> // Standard exceptions
#include <functional> // Function objects
#include <iterator> // Iterator classes
#include <limits> // Numeric limits
#include <locale> // Localization and internationalization
#include <numeric> // Numeric operations (e.g., accumulate)
#include <random> // Random number generators
#include <stdexcept> // Standard exception classes
#include <typeinfo> // Runtime type information
#include <utility> // Utility components (e.g., std::pair)
#include <complex> // Complex Module
#define int long long
using namespace std;
using ll = long long;
const int N = 2e5 + 5;
int n, k, ret, blocked[N], sz[N];
vector<int> adj[N];
void pre(int u, int p) {
sz[u] = 1;
for (auto& v : adj[u]) {
if (v == p || blocked[v]) continue;
pre(v, u);
sz[u] += sz[v];
}
}
int find_centroid(int u, int p, int tot) {
for (auto& v : adj[u]) {
if (v == p || blocked[v] || 2 * sz[v] <= tot) continue;
return find_centroid(v, u, tot);
}
return u;
}
int calc(int u, int p, int dx) {
vector<int> d(n + 1, n + 5);
d[u] = dx;
queue<int> q;
q.push(u);
while(!q.empty()) {
int a = q.front();
q.pop();
for(auto& b : adj[a]) {
if (b != p && !blocked[b] && d[b] == n + 5) {
d[b] = d[a] + 1;
q.push(b);
}
}
}
int ans = 0;
vector<int> freq(n + 1, 0);
for (int i = 1; i <= n; i++) {
if (d[i] != n + 5) freq[d[i]]++;
}
for (int i = 0, j = k; i <= j; i++, j--) {
if (i == j)
ans += freq[i] * (freq[i] - 1)/2;
else
ans += freq[i] * freq[j];
}
return ans;
}
void solve(int u) {
pre(u, 0);
int cent = find_centroid(u, 0, sz[u]);
ret += calc(cent, 0, 0);
for (auto& v : adj[cent]) {
if (!blocked[v]) ret -= calc(v, cent, 1);
}
blocked[cent] = 1;
for (auto& v : adj[cent]) {
if (!blocked[v]) {
solve(v);
}
}
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> k;
for (int i = 1; i < n;i ++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
solve(1);
cout << ret << endl;
return 0;
}