#include <bits/stdc++.h>
using namespace std;
const int N = 410000;
int n, k, rez = 1, size = 1;
vector<int> v[N];
int p2[N], cs[N], nr, el[21][4 * N], niv[N];
int aint[16 * N];
void update(int nod, int pozx, int pozy, int poz, int val) {
  if (pozx == pozy) {
    aint[nod] = val;
    return;
  }
  int mid = (pozx + pozy) / 2;
  if (mid >= poz)
    update(2 * nod, pozx, mid, poz, val);
  else
    update(2 * nod + 1, mid + 1, pozy, poz, val);
  aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
int query1(int nod, int pozx, int pozy, int poz) {
  if (!aint[nod]) return 0;
  if (pozx == pozy) return pozx;
  int s, mid = (pozx + pozy) / 2;
  if (mid < poz) {
    s = query1(2 * nod + 1, mid + 1, pozy, poz);
    if (s) return s;
  }
  return query1(2 * nod, pozx, mid, poz);
}
int query2(int nod, int pozx, int pozy, int poz) {
  if (!aint[nod]) return nr + 1;
  if (pozx == pozy) return pozx;
  int s, mid = (pozx + pozy) / 2;
  if (mid >= poz) {
    s = query2(2 * nod, pozx, mid, poz);
    if (s != nr + 1) return s;
  }
  return query2(2 * nod + 1, mid + 1, pozy, poz);
}
void dfLCA(int nod) {
  if (!cs[nod]) cs[nod] = ++nr;
  el[0][nr] = nod;
  for (vector<int>::iterator it = v[nod].begin(); it != v[nod].end(); ++it)
    if (!cs[*it]) {
      niv[*it] = niv[nod] + 1;
      dfLCA(*it);
      el[0][++nr] = nod;
    }
}
void precalc() {
  int i, j;
  for (i = 2; i < N; ++i) p2[i] = p2[i / 2] + 1;
  dfLCA(1);
  for (i = 1; i < 21; ++i)
    for (j = 1; j + (1 << i) - 1 <= nr; ++j) {
      int sz = (1 << (i - 1));
      if (niv[el[i - 1][j]] > niv[el[i - 1][j + sz]])
        el[i][j] = el[i - 1][j + sz];
      else
        el[i][j] = el[i - 1][j];
    }
}
int lca(int nod1, int nod2) {
  if (cs[nod1] > cs[nod2]) swap(nod1, nod2);
  int l = p2[cs[nod2] - cs[nod1]];
  if (niv[el[l][cs[nod1]]] > niv[el[l][cs[nod2] - (1 << l) + 1]])
    return el[l][cs[nod2] - (1 << l) + 1];
  else
    return el[l][cs[nod1]];
}
int dist(int nod1, int nod2) {
  return niv[nod1] + niv[nod2] - 2 * niv[lca(nod1, nod2)];
}
int ins(int nod) {
  int n1 = el[0][query1(1, 1, nr, cs[nod])],
      n2 = el[0][query2(1, 1, nr, cs[nod])];
  if (!n1 || !n2) {
    n1 = el[0][query2(1, 1, nr, 1)];
    n2 = el[0][query1(1, 1, nr, nr)];
  }
  return niv[nod] - niv[lca(nod, n1)] - niv[lca(nod, n2)] + niv[lca(n1, n2)];
}
int main() {
  int i, j = 2;
  cin >> n >> k;
  niv[1] = 1;
  for (i = 1; i < n; ++i) {
    int a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  precalc();
  for (i = 1; i < n; ++i) {
    update(1, 1, nr, cs[i], 1);
    if (i == j) size = 1;
    j = max(j, i + 1);
    while (j <= n && size + ins(j) <= k) {
      size += ins(j);
      update(1, 1, nr, cs[j], 1);
      ++j;
    }
    rez = max(rez, j - i);
    update(1, 1, nr, cs[i], 0);
    size -= ins(i);
  }
  cout << rez;
  return 0;
}
