#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 17;
vector<int> adj[N];
int n, k;
int cnt[N];
bool mark[N];
long long int ans = 0;
int findCentroid(int v, int n, int &ans, int par = -1) {
  int sum = 1;
  int mx = 0;
  for (int u : adj[v]) {
    if (u != par && !mark[u]) {
      int x = findCentroid(u, n, ans, v);
      sum += x;
      mx = max(mx, x);
    }
  }
  mx = max(mx, n - sum);
  if (mx <= n / 2) {
    ans = v;
  }
  return sum;
}
int getSubTreeSize(int v, int par = -1) {
  int res = 1;
  for (int u : adj[v]) {
    if (par != u && !mark[u]) {
      res += getSubTreeSize(u, v);
    }
  }
  return res;
}
void addToCnt(int v, int plus, int depth = 1, int par = -1) {
  if (depth > k) return;
  cnt[depth] += plus;
  for (int u : adj[v]) {
    if (u != par && !mark[u]) {
      addToCnt(u, plus, depth + 1, v);
    }
  }
}
void findMiddleCentroidPaths(int v, int depth = 1, int par = -1) {
  if (k - depth >= 0) ans += cnt[k - depth];
  for (int u : adj[v]) {
    if (u != par && !mark[u]) {
      findMiddleCentroidPaths(u, depth + 1, v);
    }
  }
}
void findBeginCentroidPaths(int v, int depth = 0, int par = -1) {
  if (depth == k) {
    ans++;
    return;
  }
  for (int u : adj[v]) {
    if (u != par && !mark[u]) {
      findBeginCentroidPaths(u, depth + 1, v);
    }
  }
}
void centroidDecomposition(int root, int siz) {
  int centroid;
  findCentroid(root, siz, centroid);
  mark[centroid] = true;
  findBeginCentroidPaths(centroid);
  for (int v : adj[centroid]) {
    if (mark[v]) continue;
    findMiddleCentroidPaths(v);
    addToCnt(v, +1);
  }
  for (int v : adj[centroid]) {
    if (mark[v]) continue;
    addToCnt(v, -1);
  }
  for (int v : adj[centroid]) {
    if (!mark[v]) {
      centroidDecomposition(v, getSubTreeSize(v));
    }
  }
  mark[centroid] = false;
}
int main() {
  cin >> n >> k;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    adj[v].push_back(u);
    adj[u].push_back(v);
  }
  centroidDecomposition(0, n);
  cout << ans;
}
