#include <bits/stdc++.h>
using namespace std;
const double PI = 2 * acos(0.0);
template <typename T>
struct edge {
  int from, to;
  T w;
  edge(int from, int to, T w) : from(from), to(to), w(w) {}
  edge() {}
};
template <class T>
void show(T a) {
  for (auto x : a) cout << x << " ";
  cout << endl;
}
const string DIGITS = "0123456789";
const int N = 1e6 + 9;
int n, k;
vector<int> g[N];
int deep[N];
int cnt_dfs(int v, int par) {
  if (par != -1) deep[v] = deep[par] + 1;
  int ret = 1;
  int ind = -1;
  int val = -1;
  for (int i = 0; i < ((int)(g[v].size())); ++i) {
    int to = g[v][i];
    if (to == par) continue;
    int cur = cnt_dfs(to, v);
    if (cur > val) {
      val = cur;
      ind = i;
    }
    ret += cur;
  }
  if (ind != -1) swap(g[v][0], g[v][ind]);
  return ret;
}
void dfs(int v, int par, priority_queue<int> &sack) {
  if (g[v].size() && g[v][0] != par) {
    int first = g[v][0];
    dfs(first, v, sack);
    for (int i = 1; i < ((int)(g[v].size())); ++i) {
      int to = g[v][i];
      if (to == par) continue;
      priority_queue<int> cur_sack;
      dfs(to, v, cur_sack);
      while (!cur_sack.empty()) {
        int x = cur_sack.top();
        cur_sack.pop();
        if (-x - sack.top() - 2 * deep[v] <= k) {
          if (-x > -sack.top()) {
            sack.pop();
            sack.push(x);
          }
        } else
          sack.push(x);
      }
    }
  } else {
    sack.push(-deep[v]);
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  for (int i = 0; i < int(n - 1); ++i) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  int root = -1;
  for (int v = 1; v <= n; ++v)
    if (g[v].size() > 1) root = v;
  assert(root != -1);
  cnt_dfs(root, -1);
  priority_queue<int> sack;
  dfs(root, -1, sack);
  cout << sack.size();
}
