#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &X) {
  X = 0;
  char ch = 0;
  T op = 1;
  for (; ch > '9' || ch < '0'; ch = getchar())
    if (ch == '-') op = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    X = (X << 3) + (X << 1) + ch - 48;
  X *= op;
}
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 5;
struct edge {
  int u, v, next;
} e[N * 2];
int head[N], cnt, vis[N];
int ind[N];
int n, k, ans;
void insert(int u, int v) {
  e[++cnt].u = u;
  e[cnt].v = v;
  e[cnt].next = head[u];
  head[u] = cnt;
}
int dfs(int u) {
  vis[u] = 1;
  vector<int> t;
  for (int i = head[u]; i; i = e[i].next) {
    int v = e[i].v;
    if (!vis[v]) {
      t.push_back(dfs(v) + 1);
    }
  }
  if (t.empty()) return 0;
  sort(t.begin(), t.end());
  while (t.size() > 1) {
    if (t[t.size() - 1] + t[t.size() - 2] <= k)
      break;
    else {
      ans++;
      t.pop_back();
    }
  }
  return t.back();
}
int main() {
  cin >> n >> k;
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    read(u);
    read(v);
    insert(u, v);
    insert(v, u);
    ind[u]++;
    ind[v]++;
  }
  for (int i = 1; i <= n; i++) {
    if (ind[i] > 1) {
      dfs(i);
      cout << ans + 1;
      return 0;
    }
  }
  return 0;
}
