#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const int N=1e5+5;
int diam,dep[N],max_dep[N],p1,p2;
vector<int> adj[N],path;
void dfs1(int u,int par,int d,int& p){
if(d>diam){
diam=d;
p=u;
}
for(int v:adj[u]){
if(v==par)continue;
dfs1(v,u,d+1,p);
}
}
bool dfs2(int u,int par){
if(u==p2){
path.push_back(u);
return 1;
}
for(int v:adj[u]){
if(v==par)continue;
if(dfs2(v,u)){
path.push_back(u);
return 1;
}
}
return 0;
}
void dfs3(int u,int par){
max_dep[u]=dep[u]=dep[par]+1;
for(int v:adj[u]){
if(v==par)continue;
dfs3(v,u);
max_dep[u]=max(max_dep[v],max_dep[u]);
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,k;
cin>>n>>k;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
if(n==k){
cout<<"0\n";
return 0;
}
dfs1(1,0,0,p1);
diam=0;
dfs1(p1,0,0,p2);
dfs2(p1,0);
int mid=path[(path.size()+1)/2];
dfs3(mid,0);
priority_queue<tuple<int,int,int>> q;
q.push({max_dep[mid],mid,0});
int cnt=0;
while(!q.empty()&&cnt<k){
auto [d,u,par]=q.top();
q.pop();
cnt++;
for(int v:adj[u]){
if(v==par)continue;
q.push({max_dep[v]-dep[v]+1,v,u});
}
}
auto [d,u,par]=q.top();
cout<<d<<'\n';
return 0;
}