#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;
}
