#include <bits/stdc++.h>
#define fi first
#define se second
#define rep(i,n) for(int i = 0; i < (n); ++i)
#define rrep(i,n) for(int i = 1; i <= (n); ++i)
#define drep(i,n) for(int i = (n)-1; i >= 0; --i)
#define srep(i,s,t) for (int i = s; i < (t); ++i)
#define dsrep(i,t,s) for(int i = (t)-1; i >= (s); --i)
#define rng(a) a.begin(),a.end()
#define rrng(a) a.rbegin(),a.rend()
#define isin(x,l,r) ((l) <= (x) && (x) < (r))
#define pb push_back
#define eb emplace_back
#define sz(x) (int)(x).size()
#define pcnt __builtin_popcountll
#define snuke srand((unsigned)clock()+(unsigned)time(NULL));
#define show(x) cerr<<#x<<" = "<<x<<endl;
#define bn(x) ((1<<(x))-1)
#define newline puts("")
using namespace std;
template<typename T> using vc = vector<T>;
template<typename T> using vv = vc<vc<T>>;
template<typename T> using PQ = priority_queue<T,vc<T>,greater<T> >;
using ll = long long;
using uint = unsigned;
using ull = unsigned long long;
using P = pair<int,int>;
using T3 = tuple<int,int,int>;
using vi = vc<int>;
using vvi = vv<int>;
using vl = vc<ll>;
using vp = vc<P>;
using vt = vc<T3>;
int getInt(){int x;scanf("%d",&x);return x;}
template<typename T>istream& operator>>(istream&i,vc<T>&v){rep(j,sz(v))i>>v[j];return i;}
template<typename T>string join(const vc<T>&v,const string& d=""){stringstream s;rep(i,sz(v))(i?s<<d:s)<<v[i];return s.str();}
template<typename T>ostream& operator<<(ostream&o,const vc<T>&v){if(sz(v))o<<join(v," ");return o;}
template<typename T1,typename T2>istream& operator>>(istream&i,pair<T1,T2>&v){return i>>v.fi>>v.se;}
template<typename T1,typename T2>ostream& operator<<(ostream&o,const pair<T1,T2>&v){return o<<v.fi<<","<<v.se;}
vc<string> split(const string& s,char d=' '){vc<string> r(1);for(char c:s)if(c==d)r.pb("");else r.back()+=c;return r;}
string operator*(const string& s,int t){return join(vc<string>(t,s));}
template<typename T>bool mins(T& x,const T&y){if(x>y){x=y;return true;}else return false;}
template<typename T>bool maxs(T& x,const T&y){if(x<y){x=y;return true;}else return false;}
template<typename T>T dup(T x, T y){return (x+y-1)/y;}
template<typename T>ll suma(const vc<T>&a){ll res(0);for(auto&&x:a)res+=x;return res;}
template<typename T>void uni(vc<T>& a){sort(rng(a));a.erase(unique(rng(a)),a.end());}
const double eps = 1e-10;
const ll LINF = 1001002003004005006ll;
const int INF = 1001001001;
#define dame { puts("-1"); return;}
#define yn {puts("Yes");}else{puts("No");}
const int MX = 200005;

struct Solver {
  int n;
  vvi to;
  int c;
  int cnt;
  int dfs(int v, int p=-1) {
    int y = 0;
    int w = -INF;
    for (int u : to[v]) {
      if (u == p) continue;
      int r = dfs(u,v);
      if (r < 0) maxs(w, -r);
      else maxs(y, r);
    }
    // cerr<<y<<" "<<w<<endl;
    if (y <= w-1) return -(w-1);
    if (y == c) {
      ++cnt;
      return -c;
    }
    return y+1;
  }
  int f() {
    cnt = 0;
    int r = dfs(0);
    // cerr<<r<<endl;
    if (r > 0) ++cnt;
    return cnt;
  }
  void solve() {
    int k;
    scanf("%d%d",&n,&k);
    to = vvi(n);
    rep(i,n-1) {
      int a, b;
      scanf("%d%d",&a,&b);
      --a; --b;
      to[a].pb(b);
      to[b].pb(a);
    }
    // c = 1; cerr<<f()<<endl; return;
    int l = 0, r = n;
    while (l+1<r) {
      c = (l+r)/2;
      if (f() <= k) r = c; else l = c;
    }
    cout<<r<<endl;
  }
};

int main() {
  int ts = 1;
  // scanf("%d",&ts);
  rrep(ti,ts) {
    Solver solver;
    solver.solve();
  }
  return 0;
}

#include<cstdio>
#include<iostream>

const int MAXN = 3e5 + 10, INF = 0x3f3f3f3f;
int f1[MAXN], f2[MAXN], is_key[MAXN], h[MAXN] = {0};
int N, M, tot, cnt;
struct E{
	int t, nxt;
}Ed[2 * MAXN];

void Add(int f, int t){Ed[++tot].t = t, Ed[tot].nxt = h[f]; h[f] = tot;}

void dfs(int u, int fa, int mid)
{
	f1[u] = -INF, f2[u] = INF;
	for (int i = h[u]; i; i = Ed[i].nxt)
	{
		int v = Ed[i].t; if (v == fa) continue;
		dfs(v, u, mid); 
		f1[u] = std::max(f1[u], f1[v] + 1);
		f2[u] = std::min(f2[u], f2[v] + 1);
	}
	if (is_key[u] && f2[u] > mid) f1[u] = std::max(0, f1[u]);
	if (f1[u] + f2[u] <= mid) f1[u] = -INF;
	if (f1[u] == mid) f1[u] = -INF, f2[u] = 0, cnt++;
}

int check(int mid)
{
	cnt = 0;
	dfs(1, 0, mid);
	if (f1[1] >= 0) cnt++;
	return cnt <= M;
}

int rd()
{
	int ret = 0; char ch = getchar();
	while (!isdigit(ch)) ch = getchar();
	for (; isdigit(ch); ch = getchar()) ret = ret * 10 + (int)ch - 48;
	return ret;
}

int main()
{
	N = rd(), M = rd();
	for (int i = 1; i <= N; i++) is_key[i] =1;
	for (int i = 1; i < N; i++) {int f = rd(), t = rd(); Add(f, t); Add(t, f);}
	int l = 0, r = N, ans = N;
	while (l <= r)
	{
		int mid = (l + r) >> 1; 
		if (check(mid)) ans = mid, r = mid - 1;
		else l = mid + 1;
	}
	dfs(1, 0, 1);
	printf("%d\n", ans);
	return 0;
}