/*
本题数据为一棵树,要求是修建一到两条路,
使得总巡逻距离最短,由于新建的路我们只能走一次,
所以只能减少路程一次,
本来总巡逻距离包括树上所有边两次,进去 + 原路返回
二者都会经过所有点一次,所以减少直径会是最优解,
但我们还能再建一条路,所以要考虑第一条边建立后的影响,
由于我们至少要到达每一个点一次,即由一条边进去一次,
所以要是二者减少的直径有重合处,就意味着我们少到了哪些点,
而要是想到达哪些点,则意味着我们要走两遍重合处,
进去 + 原路返回,
同时求第二条直径时,必须具备判断重合处的能力,
我们可以靠取反第一条直径达成目的(有重合处时不减少反增加)
等于加上重合处的路径。
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 100010, M = N * 2, INF = 0x3f3f3f3f;
int h[N], e[M], w[M], ne[M], idx;
void add(int a, int b)
{
e[idx] = b;
w[idx] = 1;
ne[idx] = h[a];
h[a] = idx ++;
}
int n, k;
int d[N], path[N];
int q[N];
int bfs(int root)
{
memset(d, 0x3f, sizeof d);
d[root] = 0;
path[root] = -1;
int hh = 0, tt = -1;
q[++ tt] = root;
int res = root;
while(hh <= tt)
{
int u = q[hh ++];
for(int i = h[u]; ~i; i = ne[i])
{
int j = e[i], dist = d[u] + w[i];
if(d[j] == INF)
{
d[j] = dist;
if(d[j] > d[res]) res = j;
path[j] = i;
q[++ tt] = j;
}
}
}
return res;
}
int d1[N], d2[N], diam;
void dfs(int u, int fa) // 树形DP
{
d1[u] = d2[u] = 0;
for(int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if(j == fa) continue;
dfs(j, u);
diam = max(diam, d1[u] + d1[j] + w[i]);
if(d1[j] + w[i] > d1[u]) d2[u] = d1[u], d1[u] = d1[j] + w[i];
else if(d1[j] + w[i] > d2[u]) d2[u] = d1[j] + w[i];
}
}
int main()
{
memset(h, -1, sizeof h);
scanf("%d%d", &n, &k);
for(int i = 1; i < n; i ++)
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
int a = bfs(1), b = bfs(a);
int res = 2 * (n - 1) - d[b] + 1;
if(k == 2)
{
int u = b;
while(u != a)
{
w[path[u]] = w[path[u] ^ 1] = -1;
u = e[path[u] ^ 1];
}
dfs(1, -1);
res = res - diam + 1;
}
printf("%d", res);
return 0;
}