#include <bits/stdc++.h>
using namespace std;
long long max(long long a, long long b) {
  if (a < b) return b;
  return a;
}
long long min(long long a, long long b) {
  if (a < b) return a;
  return b;
}
long long pos[50000 + 5];
long long cnt[50000 + 5][500 + 5];
vector<vector<long long> > v(50000 + 5);
long long K;
long long ans = 0;
void setPos(long long node, long long par, long long d) {
  pos[node] = d;
  for (int i = 0; i < v[node].size(); i++) {
    long long adj = v[node][i];
    if (adj == par) continue;
    setPos(adj, node, d + 1);
  }
  cnt[node][0] = 1;
  for (int i = 0; i < v[node].size(); i++) {
    long long adj = v[node][i];
    if (adj == par) continue;
    for (int j = 0; j < K; j++) cnt[node][j + 1] += cnt[adj][j];
  }
}
void dfs(long long node, long long par) {
  long long x[K + 1];
  memset(x, 0, sizeof(x));
  for (int i = 0; i < v[node].size(); i++) {
    long long adj = v[node][i];
    if (adj == par) continue;
    for (int l = 0; l <= K - 1; l++) {
      long long L = l, R = K - l - 1;
      if (L == 0 || R == 0) continue;
      {
        long long a = cnt[adj][L - 1];
        long long b = cnt[node][R] - cnt[adj][R - 1] - x[L];
        x[L] += cnt[adj][R - 1];
        ans += a * b;
      }
    }
  }
  for (int i = 0; i < v[node].size(); i++) {
    long long adj = v[node][i];
    if (adj == par) continue;
    dfs(adj, node);
  }
}
void subtract(long long node, long long par, long long d) {
  if (d >= K) ans++;
  for (int i = 0; i < v[node].size(); i++) {
    long long adj = v[node][i];
    if (adj == par) continue;
    subtract(adj, node, d + 1);
  }
}
void solve() {
  ans = 0;
  memset(pos, 0, sizeof(pos));
  memset(cnt, 0, sizeof(cnt));
  long long n, k;
  cin >> n >> k;
  k++;
  K = k;
  for (int i = 0; i < n - 1; i++) {
    long long a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  setPos(1, 0, 0);
  dfs(1, 0);
  subtract(1, 0, 1);
  cout << ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  solve();
  return 0;
}
