#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
ifstream in("atac.in");
ofstream out("atac.out");
int poz[100000],log[100000],maxad,put[40],n;
vector<pair<int,int> >euler,tata(33000);
vector<vector<pair<int,int> > > a(100000),b(32,vector<pair<int,int> >(100000)),lca(32,vector<pair<int,int> >(10000));
void dfs(int x)
{
int adancime=0;
poz[x]=euler.size();
if (x!=1)
adancime=euler.back().ss+1;
maxad=max(maxad,adancime);
euler.pb(mp(x,adancime));
//cout<<x<<' '<<adancime<<'\n';
vector<pair<int,int> >::iterator it;
fori(it,a[x])
{
dfs(it->ss);
euler.pb(mp(x,adancime));
}
}
void rmq()
{
int i,j;
FOR(i,0,euler.size()-1)
lca[0][i]=mp(euler[i].ss,i);
FOR(j,1,log[euler.size()])
{
FOR(i,0,euler.size()-put[j])
lca[j][i]=min(lca[j-1][i],lca[j-1][i+put[j-1]]);
}
//cout<<n<<'\n';
}
void drum_minim()
{
int i,j;
// cout<<n<<'\n';
FOR(i,1,n)
b[0][i]=tata[i];
FOR(j,1,log[maxad+1])
{
FOR(i,1,n)
if(euler[poz[i]].ss>=put[j])
{
b[j][i].fs=min(b[j-1][i].fs,b[j-1][b[j-1][i].ss].fs);
b[j][i].ss=b[j-1][b[j-1][i].ss].ss;
// if(j==1&&i==3)
// cout<<"HAI FRATE";
}
// else
// cout<<i<<' '<<euler[poz[i]].ss<<' '<<put[j]<<'\n';
}
}
int cauta(int x,int y)
{
if (y==0)
return 1<<30;
//cout<<log[y]<<' '<<x<<'\n';
return min(b[log[y]][x].fs,cauta(b[log[y]][x].ss,y-put[log[y]]));
}
int bombe(int x,int y)
{
if(poz[x]>poz[y])
swap(x,y);
pair<int,int> nod=min(lca[log[poz[y]-poz[x]+1]][x],lca[log[poz[y]-poz[x]+1]][poz[y]-put[log[poz[y]-poz[x]+1]]+1]);
//cout<<(euler[poz[x]].ss-euler[nod.ss].ss)<<' '<<(euler[poz[y]].ss-euler[nod.ss].ss)<<'\n';
return min(cauta(x,euler[poz[x]].ss-euler[nod.ss].ss),cauta(y,euler[poz[y]].ss-euler[nod.ss].ss));
}
int main()
{
int i,m,p,x,y,z,A,B,C,D;
in>>n>>m>>p;
FOR(i,2,n)
{
in>>x>>y;
a[x].pb(mp(y,i));
tata[i]=mp(y,x);
}
dfs(1);
log[1]=0;
x=2;
y=1;
FOR(i,2,euler.size()) //calc log si put
{
if (x==i)
{
x*=2;
y++;
}
log[i]=y-1;
}
put[0]=1;
for(i=1;i<=29;i++)
put[i]=put[i-1]*2;
rmq();
drum_minim();
//cout<<tata[6].fs<<' '<<tata[6].ss<<'\n';
/*in>>x>>y>>A>>B>>C>>D;
z=bombe(x,y);
//cout<<b[1][3].fs<<'\n';
//cout<<x<<' '<<y<<' '<<z<<'\n';
if (p==m)
out<<z<<'\n';
FOR(i,2,m)
{
x=(x*A+y*B)%n+1;
y=(y*C+z*D)%n+1;
z=bombe(x,y);
if (i>=m-p+1)
out<<z<<'\n';
}*/
in.close();
out.close();
return 0;
}