#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
//英语 看博友好分析 抄博友好程序 树形dp 背
int n,m;
vector<int> G[200];
int fa[200];
int dp[200][200];//以i为根的子树 有j个节点 最少截断多少条边
int dfs(int root)
{
for(int i=0;i<G[root].size();i++)
{
dfs(G[root][i]);
}
dp[root][1]=G[root].size();
for(int i=0;i<G[root].size();i++)
{
//for(int j=0;j<=m-1;j++)//wa 出现负值
// for(int j=1;j<=m-1;j++)//wa
for(int j=m-1;j>=0;j--)//背 小的不影响大的
{
for(int k=1;k+j<=m;k++)
{
dp[root][j+k]=min(dp[root][j+k],dp[root][j]+dp[G[root][i]][k]-1);//背
}
}
}
return dp[root][m];
}
int main()
{
scanf("%d%d",&n,&m);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
fa[y]=x;
}
int root=1;
while(fa[root]!=0)
{
root=fa[root];
}
//cout<<root<<endl;
int jg=dfs(root);
for(int i=1;i<=n;i++)
{
if(i!=root)
{
jg=min(jg,dp[i][m]+1);
}
//cout<<i<<" "<<dp[i][m]<<endl;
}
printf("%d\n",jg);
return 0;
}