#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m, c, cur;
int fa[N][20];
int ord[N], dep[N], idx[N];
vector<int> E[N];
set<int> s;
void dfs(int u, int f = 0, int d = 0) {
  dep[u] = d;
  idx[u] = c;
  ord[c++] = u;
  fa[u][0] = f;
  for (int i = 0; i < (int)(E[u].size()); i++) {
    if (E[u][i] != f) {
      dfs(E[u][i], u, d + 1);
    }
  }
}
int getLca(int u, int v) {
  if (dep[u] > dep[v]) swap(u, v);
  for (int k = 19; ~k && dep[v] != dep[u]; k--)
    if (dep[fa[v][k]] >= dep[u]) v = fa[v][k];
  if (u == v) return u;
  for (int k = 19; ~k; k--)
    if (fa[u][k] != fa[v][k]) {
      u = fa[u][k];
      v = fa[v][k];
    }
  return fa[u][0];
}
int getDist(int u, int v) {
  u = ord[u];
  v = ord[v];
  return dep[u] + dep[v] - 2 * dep[getLca(u, v)];
}
void add(int i) {
  i = idx[i];
  if (!s.empty()) {
    set<int>::iterator lhs = i < *s.begin() ? --s.end() : --s.lower_bound(i);
    set<int>::iterator rhs = i > *--s.end() ? s.begin() : s.lower_bound(i);
    cur -= getDist(*lhs, *rhs);
    cur += getDist(*lhs, i);
    cur += getDist(*rhs, i);
  }
  s.insert(i);
}
void remove(int i) {
  i = idx[i];
  s.erase(i);
  if (!s.empty()) {
    set<int>::iterator lhs = i < *s.begin() ? --s.end() : --s.lower_bound(i);
    set<int>::iterator rhs = i > *--s.end() ? s.begin() : s.lower_bound(i);
    cur -= getDist(i, *lhs);
    cur -= getDist(i, *rhs);
    cur += getDist(*lhs, *rhs);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (int)(n - 1); i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--;
    b--;
    E[a].push_back(b);
    E[b].push_back(a);
  }
  dfs(0);
  for (int j = 0; j < (int)(19); j++)
    for (int i = 0; i < (int)(n); i++) fa[i][j + 1] = fa[fa[i][j]][j];
  int ans = 1;
  int qh = 0;
  for (int qt = 0; qt < n; qt++) {
    add(qt);
    while ((cur + 2) / 2 > m) {
      remove(qh++);
    }
    ans = max(ans, qt - qh + 1);
  }
  cout << ans << endl;
  return 0;
}
