#include<bits/stdc++.h>
using namespace std;
int n,m,head[500005],head2[500005],cnt,fa[500005],vis[500005],s,ans[500005],cnt2;
struct edge
{
int to;
int next;
int val;
}e[500005],e2[500005];
void add2(int x,int y,int z)
{
cnt2++;
e2[cnt2].val=z;
e2[cnt2].to=y;
e2[cnt2].next=head2[x];
head2[x]=cnt2;
}
void add(int x,int y)
{
cnt++;
e[cnt].to=y;
e[cnt].next=head[x];
head[x]=cnt;
}
int find(int x)
{
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
void Tarjan(int x)
{
vis[x]=1;
//cout<<"in"<<endl;
for(int i=head[x];i;i=e[i].next)
{
if(vis[e[i].to]==1) continue;
Tarjan(e[i].to);
fa[e[i].to]=x;
}
for(int i=head2[x];i;i=e2[i].next)
{
if(vis[e2[i].to]==1)
{
ans[e2[i].val]=find(e2[i].to);
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=n-1;i++)
{
int a,b;
cin>>a>>b;
add(a,b);add(b,a);
}
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
add2(a,b,i);add2(b,a,i);
}
Tarjan(s);
for(int i=1;i<=m;i++)
cout<<ans[i]<<endl;
return 0;
}