#include <bits/stdc++.h>
const int maxn = 2e5 + 7, lg = 22;
using namespace std;
int n, k, ord[maxn], h[maxn], par[lg][maxn], size;
vector<int> a[maxn];
struct cmp {
  bool operator()(int x, int y) { return ord[x] < ord[y]; }
};
int DfsCnt;
inline void dfs(int x = 1) {
  for (int i = 1; i < lg; i++) par[i][x] = par[i - 1][par[i - 1][x]];
  for (auto i : a[x])
    if (i != par[0][x]) par[0][i] = x, h[i] = h[x] + 1, dfs(i);
  ord[x] = ++DfsCnt;
}
inline int lca(int x, int y) {
  if (h[x] < h[y]) swap(x, y);
  for (int i = 21; i >= 0; i--)
    if (h[x] - (1 << i) >= h[y]) x = par[i][x];
  if (x == y) return x;
  for (int i = 21; i >= 0; i--)
    if (par[i][x] != par[i][y]) x = par[i][x], y = par[i][y];
  return par[0][x];
}
inline int dis(int x, int y) { return (h[x] + h[y] - 2 * h[lca(x, y)]); }
set<int, cmp> s;
void push(int x) {
  auto it = s.lower_bound(x);
  int u = *(it == s.end() ? s.begin() : it),
      v = (it == s.begin() ? *s.rbegin() : *(--it));
  s.insert(x);
  size += (dis(x, v) + dis(x, u) - dis(u, v)) / 2;
}
void pop(int x) {
  s.erase(s.find(x));
  if (!s.empty()) {
    auto it = s.lower_bound(x);
    int u = *(it == s.end() ? s.begin() : it),
        v = (it == s.begin() ? *s.rbegin() : *(--it));
    size -= (dis(x, v) + dis(x, u) - dis(u, v)) / 2;
  } else
    size = 0;
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    a[x].push_back(y);
    a[y].push_back(x);
  }
  dfs();
  int l = 1, r = 2, ans = 1;
  s.insert(1);
  size++;
  while (l <= n && r <= n) {
    push(r);
    while (l <= r && size > k) pop(l++);
    if (size <= k) ans = max(ans, r - l + 1);
    r++;
  }
  printf("%d", ans);
}
