#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ldb double
template<typename T>void ckmn(T&a,T b){a=min(a,b);}
template<typename T>void ckmx(T&a,T b){a=max(a,b);}
void rd(int&x){scanf("%i",&x);}
void rd(ll&x){scanf("%lld",&x);}
void rd(char*x){scanf("%s",x);}
void rd(ldb&x){scanf("%lf",&x);}
void rd(string&x){scanf("%s",&x);}
template<typename T1,typename T2>void rd(pair<T1,T2>&x){rd(x.first);rd(x.second);}
template<typename T>void rd(vector<T>&x){for(T&i:x)rd(i);}
template<typename T,typename...A>void rd(T&x,A&...args){rd(x);rd(args...);}
template<typename T>void rd(){T x;rd(x);return x;}
int ri(){int x;rd(x);return x;}
template<typename T>vector<T> rv(int n){vector<T> x(n);rd(x);return x;}
template<typename T>void ra(T a[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]);}
template<typename T1,typename T2>void ra(T1 a[],T2 b[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]),rd(b[st+i]);}
template<typename T1,typename T2,typename T3>void ra(T1 a[],T2 b[],T3 c[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]),rd(b[st+i]),rd(c[st+i]);}
void re(vector<int> E[],int m,bool dir=0){for(int i=0,u,v;i<m;++i){rd(u,v);E[u].pb(v);if(!dir)E[v].pb(u);}}
template<typename T>void re(vector<pair<int,T>> E[],int m,bool dir=0){for(int i=0,u,v;i<m;++i){T w;rd(u,v,w);E[u].pb({v,w});if(!dir)E[v].pb({u,w});}}

const int N=200050;
const int inf=1e9+7;

int lim;
vector<int> E[N];

int now;
pii DFS(int u,int p){
	//int fir=-inf,sec=-inf;
	int mn=inf,fir=-inf;
	int mx1=0,mx2=0;
	for(int v:E[u]){
		if(v!=p){
			pii d=DFS(v,u);
			d.first+=1;
			d.second+=1;
			ckmn(mn,d.first);
			//if(d.first>fir)sec=fir,fir=d.first;
			//else ckmx(sec,d.first);
			ckmx(mx1,d.second);
		}
	}
	//if(fir+sec>lim*2+1||max(fir,1)+mx1>lim){
	if((mx1>=lim)){
		//printf("%i ",u);
		now++;
		return {0,-inf};
	}else{
		//if(fir>0)return {fir,-inf};
		//return {inf,mx1};
		if(mn<inf&&mn+mx1<=lim)return {mn,-inf};
		if(p==0)now++;
		return {mn,mx1};
	}
}
int Solve(){
	now=0;
	//printf("%i: ",lim);
	DFS(1,0);
	//printf("\n");
	return max(now,1);
}
int main(){
	int n,k;rd(n,k);
	re(E,n-1);
	int top=n,bot=0,ans=n;
	while(top>=bot){
		int mid=top+bot>>1;
		lim=mid;
		if(Solve()<=k)top=mid-1,ans=mid;
		else bot=mid+1;
	}
	printf("%i\n",ans);
	return 0;
}

#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
const int maxn=2e5+10;
struct Node{
	int x;
	int y;
	friend bool operator < (const Node &a,const Node &b){
		return a.x<b.x;
	}
}a[maxn];
vector<int> ve[maxn];
vector<int> bj[maxn];
map<int,int> mp;
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++)
		scanf("%d%d",&a[i].x,&a[i].y);
	sort(a+1,a+1+k);
	int cnt=0;
	for(int i=1;i<=k;i++){
		if(a[i].x!=a[i-1].x)
			cnt++;
		ve[cnt].push_back(a[i].y);
	}
	mp[n]=1;
	for(int i=1;i<=cnt;i++){
		for(int j=0;j<ve[i].size();j++){
			if(mp[ve[i][j]-1]||mp[ve[i][j]+1])
				bj[i].push_back(1);
			else
				bj[i].push_back(0);
		}
		for(int j=0;j<ve[i].size();j++){
			if(bj[i][j])
				mp[ve[i][j]]=1;
			else
				mp[ve[i][j]]=0;
		}
	}
	int ans=0;
	for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
		if(it->second)
			ans++;
	printf("%d",ans);
	return 0;
}