#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <sstream>
#include <cmath>
#include <set>
#include <iomanip>
#include <deque>
#include <stdio.h>
using namespace std;

#define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define RREP(i,n) for(int (i)=(int)(n)-1;i>=0;i--)
#define iREP(i,Itr) for(auto (i)=(Itr).begin();(i)!=(Itr).end();(i)++)
#define REMOVE(Itr,n) (Itr).erase(remove((Itr).begin(),(Itr).end(),n),(Itr).end())
#define PB_VEC(Itr1,Itr2) (Itr1).insert((Itr1).end(),(Itr2).begin(),(Itr2).end())
#define UNIQUE(Itr) sort((Itr).begin(),(Itr).end()); (Itr).erase(unique((Itr).begin(),(Itr).end()),(Itr).end())
#define LBOUND(Itr,val) lower_bound((Itr).begin(),(Itr).end(),(val))
#define UBOUND(Itr,val) upper_bound((Itr).begin(),(Itr).end(),(val))
typedef long long ll;

int N,K;
vector<int> G[2001];

int diam(){
    vector<int> dcost(N+1);
    vector<bool> dused(N+1);
    REP(i,N+1)dused[i]=false;
    REP(i,N+1)dcost[i]=0;
    stack<int> sta;
    sta.push(1);
    while(sta.size()!=0){
        int t=sta.top(); sta.pop();
        dused[t]=true;
        REP(i,G[t].size()){
            if(!dused[G[t][i]]){
                dcost[G[t][i]]=dcost[t]+1;
                sta.push(G[t][i]);
            }
        }
    }
    
    int maxt=-1,idxt=-1;
    for(int i=1;i<=N;i++){
        if(maxt<dcost[i]){
            maxt=dcost[i];
            idxt=i;
        }
    }
    
    REP(i,N+1)dused[i]=false;
    REP(i,N+1)dcost[i]=0;
    sta.push(idxt);
    while(sta.size()!=0){
        int t=sta.top(); sta.pop();
        dused[t]=true;
        REP(i,G[t].size()){
            if(!dused[G[t][i]]){
                dcost[G[t][i]]=dcost[t]+1;
                sta.push(G[t][i]);
            }
        }
    }
    
    maxt=-1; idxt=-1;
    for(int i=1;i<=N;i++){
        if(maxt<dcost[i]){
            maxt=dcost[i];
            idxt=i;
        }
    }
    return maxt;
}

int cost[2001];
bool used[2001];

void dfs(int v){
    stack<int> sta;
    sta.push(v);
    while(sta.size()!=0){
        int t=sta.top(); sta.pop();
        used[t]=true;
        REP(i,G[t].size()){
            if(!used[G[t][i]]){
                cost[G[t][i]]=min(cost[G[t][i]],cost[t]+1);
                sta.push(G[t][i]);
            }
        }
    }
}

int main(){
    
    cin>>N>>K;
    vector<int> E1(N),E2(N);
    REP(i,N-1){
        int a,b; cin>>a>>b;
        G[a].push_back(b);
        G[b].push_back(a);
        E1[i]=a; E2[i]=b;
    }
    
    int ans=1e9;
    if(K%2==0){
        for(int i=1;i<=N;i++){
            REP(j,2001)cost[j]=1e9;
            cost[i]=0;
            REP(j,2001)used[j]=false;
            dfs(i);
            int anst=0;
            for(int j=1;j<=N;j++){
                if(cost[j]>K/2)anst++;
            }
            ans=min(ans,anst);
           /* cout<<i<<":";
            REP(i,N)cout<<cost[i+1]<<" ";
            cout<<endl;*/
        }
    }else{
        REP(i,N-1){
            REP(j,2001)cost[j]=1e9;
            REP(j,2001)used[j]=false;
            cost[E1[i]]=0;
            dfs(E1[i]);
            REP(j,2001)used[j]=false;
            cost[E2[i]]=0;
            dfs(E2[i]);
            int anst=0;
            for(int j=1;j<=N;j++){
                if(cost[j]>K/2)anst++;
            }
            ans=min(ans,anst);
        }
    }
    
    cout<<ans<<endl;
    
    return 0;
}


Measured memory_bytes: 384