#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#include<cassert>
#define ll long long
#define pb push_back
#define SZ(X) ((ll)X.size())
using namespace std;
 
const int maxn = 610000;
 
int n,K;
struct edge
{
	int y,nex;
}a[maxn<<1]; int len,fir[maxn];
inline void ins(const int x,const int y){ a[++len]=(edge){y,fir[x]};fir[x]=len; }
 
int seg[maxn<<2],flag[maxn<<2];
int loc,c,lx,rx;
void pushdown(const int x)
{
	if(flag[x])
	{
		int fl=flag[x]; flag[x]=0;
		int lc=x<<1,rc=lc|1;
		
		seg[lc]+=fl,seg[rc]+=fl;
		flag[lc]+=fl,flag[rc]+=fl;
	}
}
void upd(const int x,const int l,const int r)
{
	if(l==r) { seg[x]=c;return; }
	int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
	pushdown(x);
	if(loc<=mid) upd(lc,l,mid);
	else upd(rc,mid+1,r);
	seg[x]=max(seg[lc],seg[rc]);
}
void upd2(const int x,const int l,const int r)
{
	if(rx<l||r<lx) return;
	if(lx<=l&&r<=rx)
	{
		seg[x]+=c;
		flag[x]+=c;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
	upd2(lc,l,mid); upd2(rc,mid+1,r);
	seg[x]=max(seg[lc],seg[rc]);
}
int query(const int x,const int l,const int r)
{
	if(l==r)return seg[x];
	pushdown(x);
	int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
	if(loc<=mid) return query(lc,l,mid);
	else return query(rc,mid+1,r);
}
int query2(const int x,const int l,const int r)
{
	if(rx<l||r<lx) return 0;
	if(lx<=l&&r<=rx) return seg[x];
	pushdown(x);
	int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
	return max(query2(lc,l,mid),query2(rc,mid+1,r));
}
 
int dis[maxn],son[maxn];
void dfs(const int x,const int fa)
{
	dis[x]=0;
	int mxd=0;
	for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa)
	{
		dfs(y,x);
		if(mxd<=dis[y]) mxd=dis[y],son[x]=y;
		dis[x]=max(dis[x],dis[y]+1);
	}
}
 
int ans;
void dp(const int x,const int fa,const int L)
{
	if(!son[x])
	{
		loc=L,c=1,upd(1,1,2*n);
		return;
	}
	dp(son[x],x,L+1);
	loc=L,c=1; upd(1,1,2*n);
	lx=L+1,rx=L+dis[x],c=1; upd2(1,1,2*n);
	
	for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa&&y!=son[x])
	{
		dp(y,x,L+dis[x]+1);
		
		// 1
		for(int u=min(dis[y]+1,K),i=u;i>=1;i--)
		{
			int fx,fy;
			loc=L+i,fx=query(1,1,2*n);
			loc=L+dis[x]+1+i-1,fy=query(1,1,2*n);
			
			int temp=fx;
			lx=L+dis[x]+1+0,rx=L+dis[x]+1+min(K-i-1,i-1);
			if(lx<=rx) temp=max(temp,fx + query2(1,1,2*n) );
			
			lx=L+0,rx=L+min(K-i,i);
			if(lx<=rx) temp=max(temp,fy + query2(1,1,2*n) );
			
			loc=L+i,c=temp,upd(1,1,2*n);
		}
		// 2
		if(K-1-dis[y]>dis[y]+1)
		{
			lx=L+dis[x]+1,rx=min(L+dis[x]+1+dis[y],L+dis[x]+1+K);
			c=query2(1,1,2*n);
			
			lx=L+dis[y]+2,rx=min(L+K-1-dis[y],L+dis[x]);
			if(lx<=rx) upd2(1,1,2*n);
		}
		// 3
		if(dis[x]+dis[y]+1>K)
		{
			int fy=0;
			for(int i=0;i<dis[y]&&K-i-1>dis[y]+1;i++)
			{
				loc=L+K-i-1;
				int fx=query(1,1,2*n);
				loc=L+dis[x]+1+i;
				fy=max(fy,query(1,1,2*n));
				
				loc=L+K-i-1,c=fx+fy;
				upd(1,1,2*n);
			}
		}
		
		for(int i=0;i<=dis[y];i++)
		{
			loc=L+dis[x]+1+i,c=0;
			upd(1,1,2*n);
		}
	}
	
	lx=L+0,rx=L+K;
	ans=max(ans,query2(1,1,2*n));
}
 
int main()
{
	scanf("%d%d",&n,&K);
	for(int i=1;i<n;i++)
	{
		int x,y; scanf("%d%d",&x,&y);
		ins(x,y),ins(y,x);
	}
	
	dfs(1,0);
	dp(1,0,1);
	
	printf("%d\n",n-ans);
	
	return 0;
}

Measured memory_bytes: 3972