#include <bits/stdc++.h>
static inline void setio(void);
const int MAX_N = 1e6 + 7;
int n, k;
std::vector<int> gr[MAX_N];
int depth[MAX_N], max_depth[MAX_N];
void dfs(const int& cur, const int& par, const int& dep) {
  max_depth[cur] = depth[cur] = dep;
  for (const auto& nei : gr[cur]) {
    if (nei == par) continue;
    dfs(nei, cur, dep + 1);
    max_depth[cur] = std::max(max_depth[cur], max_depth[nei]);
  }
}
void go(const int& cur, const int& par, std::multiset<int>& daddy) {
  if (static_cast<int>(gr[cur].size()) <= 1) {
    daddy.insert(depth[cur]);
    return;
  }
  for (const auto& nei : gr[cur]) {
    if (nei == par) continue;
    std::multiset<int> kiddo;
    go(nei, cur, kiddo);
    if (kiddo.size() > daddy.size()) std::swap(kiddo, daddy);
    daddy.insert(kiddo.begin(), kiddo.end());
  }
  int cnt = 0, me = depth[cur];
  for (const auto& val : daddy) {
    if (me + val - 2 * depth[cur] <= k) {
      ++cnt;
      me = val;
    } else
      break;
  }
  if (me > depth[cur]) daddy.insert(me);
  daddy.erase(daddy.begin(), std::next(daddy.begin(), cnt));
}
int main(void) {
  setio();
  std::cin >> n >> k;
  int mx = 0;
  for (int i = 1, a, b; i < n; ++i) {
    std::cin >> a >> b;
    --a;
    --b;
    gr[a].push_back(b);
    gr[b].push_back(a);
    if (gr[a].size() > gr[mx].size()) mx = a;
    if (gr[b].size() > gr[mx].size()) mx = b;
  }
  dfs(mx, -1, 0);
  std::multiset<int> sets;
  go(mx, -1, sets);
  std::cout << sets.size() << "\n";
  std::cerr << static_cast<double>(clock()) / CLOCKS_PER_SEC << "\n";
  return 0;
}
static inline void setio(void) {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.precision(10);
  std::cout << std::fixed;
}
