#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], dp2[MAXN][MAXK];
int N, K;
void dfs(int u, int p) {
for (int v : g[u]) {
if (v == p) continue;
dfs(v, u);
}
dp2[u][0] = 1;
dp[u][0] = 1;
for (int v : g[u]) {
if (v == p) continue;
dp[u][0] = max(dp[u][0], 1 + dp[v][0]);
}
for (int j = 1; j <= K; ++j) {
// dp2[u][j]: path ending at u after j backs
ll best = 0;
for (int v : g[u]) {
if (v == p) continue;
best = max(best, dp2[v][j - 1]);
}
dp2[u][j] = 1 + best;
// dp[u][j]: unconstrained
dp[u][j] = dp2[u][j];
for (int v : g[u]) {
if (v == p) continue;
dp[u][j] = max(dp[u][j], 1 + dp[v][j]);
}
// merging
vector<multiset<ll>> val(j);
for (int v : g[u]) {
if (v == p) continue;
for (int rem = 0; rem <= j - 1; ++rem) {
val[rem].insert(dp[v][rem]);
}
}
for (int v : g[u]) {
if (v == p) continue;
for (int x = 0; x <= j - 1; ++x) {
ll left = dp2[v][x];
ll rem = j - 1 - x;
if (rem < 0) continue;
val[rem].erase(val[rem].find(dp[v][rem]));
if (!val[rem].empty()) {
ll right = *val[rem].rbegin();
dp[u][j] = max(dp[u][j], 1 + left + right);
}
val[rem].insert(dp[v][rem]);
}
}
}
}
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 = 0;
for (int j = 0; j <= K; ++j) {
ans = max(ans, dp[1][j]);
}
cout << ans << '\n';
}