#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 200005;
const int MAXK = 105;
vector<int> g[MAXN];
ll dp[MAXN][MAXK];
ll dp2[MAXN];
int N, K;
void dfs(int u, int p) {
for (int v : g[u]) {
if (v == p) continue;
dfs(v, u);
}
// Base: longest path down with 0 backs
dp[u][0] = 1;
dp2[u] = 1;
for (int v : g[u]) {
if (v == p) continue;
//dp[u][0] = max(dp[u][0], 1 + dp[v][0]);
dp2[u] = max(dp2[u], 1 + dp2[v]);
}
// For j >= 1 backs
for (int j = 1; j <= K; ++j) {
ll best = 0;
// Case: no back at u
for (int v : g[u]) {
if (v == p) continue;
best = max(best, dp[v][j - 1]);
}
dp[u][j] = 1 + best;
// Case: back at u: merge two children
vector<multiset<ll>> val(j); // val[rem]: all dp[c][rem]
for (int v : g[u]) {
if (v == p) continue;
for (int k = 0; k <= j - 1; ++k) {
val[k].insert(dp[v][k]);
}
}
for (int v : g[u]) {
if (v == p) continue;
for (int k = 0; k <= j - 1; ++k) {
ll left = dp[v][k];
ll rem = j - 1 - k;
if (rem < 0) continue;
ll rightPart = dp[v][rem];
val[rem].erase(val[rem].find(rightPart));
if (!val[rem].empty()) {
ll right = *val[rem].rbegin();
dp[u][j] = max(dp[u][j], 1 + left + right);
}
val[rem].insert(rightPart);
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
for (int i = 1; i < N; ++i) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 0);
ll ans = dp2[1];
for (int j = 1; j <= K; ++j) {
ans = max(ans, dp[1][j]);
}
//cout << dp[1][1] << '\n';
cout << ans << '\n';
return 0;
}