#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
namespace IO_Optimization {
inline int read() {
  int X = 0, w = 0;
  char ch = 0;
  while (!isdigit(ch)) {
    w |= ch == '-';
    ch = getchar();
  }
  while (isdigit(ch)) {
    X = (X << 3) + (X << 1) + (ch ^ 48);
    ch = getchar();
  }
  return w ? -X : X;
}
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
}  // namespace IO_Optimization
using namespace IO_Optimization;
const int MAX = 1000000 + 5;
struct Node {
  int x, y;
} node[MAX << 1];
int n, k, num, ans;
int in[MAX], h[MAX];
inline void add(int x, int y) {
  node[++num] = (Node){h[x], y};
  h[x] = num;
  node[++num] = (Node){h[y], x};
  h[y] = num;
}
inline int dfs(int x, int f = 0) {
  if (in[x] == 1) return 0;
  vector<int> dis;
  for (register int i = h[x]; i != 0; i = node[i].x) {
    if (node[i].y != f) dis.push_back(dfs(node[i].y, x) + 1);
  }
  sort(dis.begin(), dis.end());
  int i = 0;
  for (i = dis.size() - 1; i >= 1; i -= 1) {
    if (dis[i] + dis[i - 1] <= k) break;
    ans += 1;
  }
  return dis[i];
}
int main() {
  n = read(), k = read();
  for (register int i = 1; i < n; ++i) {
    int x = read(), y = read();
    add(x, y);
    in[x] += 1, in[y] += 1;
  }
  int s = 1;
  for (register int i = 1; i <= n; i += 1)
    if (in[i] > 1) {
      s = i;
      break;
    }
  dfs(s);
  write(ans + 1);
  return 0;
}
