#include <bits/stdc++.h>
#define ll long long
#define il inline
#define rt return
#define N 500005
using namespace std;
il int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
rt x*f;
}
il void print(int a)
{
if(a<0) putchar('-'),a=-a;
if(a/10) print(a/10);
putchar(a%10+48);
}
struct dsu
{
vector<size_t>pa,size;
explicit dsu(size_t size_):pa(size_),size(size_,1)
{
iota(pa.begin(),pa.end(),0);
}
size_t find(size_t x){rt pa[x]==x?x:pa[x]=find(pa[x]);}
void unite(size_t x,size_t y)
{
x=find(x),y=find(y);
if(x==y) rt;
if(size[x]<size[y]) swap(x,y);
pa[y]=x;
size[x]+=size[y];
}
};
struct Edge
{
int from,to;
int nxt;
int LCA;
Edge():from(-1),to(-1),nxt(-1),LCA(-1){};
Edge(int u,int v,int w):
from(u),to(v),nxt(w),LCA(-1){}
}edge[N<<1],qed[N<<1];
int hd[N],qhd[N];
bool vis[N];
int n,m,s;
int cnt=-1,cnt2=-1;
void add(int x,int y)
{
edge[++cnt]=Edge(x,y,hd[x]);
hd[x]=cnt;
}
void sdd(int x,int y)
{
qed[++cnt2]=Edge(x,y,qhd[x]);
qhd[x]=cnt2;
}
void tarjan(dsu d,int u)
{
vis[u]=1;
for(int i=hd[u];i!=-1;i=edge[i].nxt)
{
Edge &e=edge[i];
if(!vis[e.to])
{
tarjan(d,e.to);
d.unite(u,e.to);
}
}
for(int i=qhd[u];i!=-1;i=qed[i].nxt)
{
Edge &e=qed[i];
if(vis[e.to])
qed[i^1].LCA=e.LCA=d.find(e.to);
}
}
void init()
{
memset(hd,0xff,sizeof(hd));
memset(qhd,0xff,sizeof(qhd));
}
int main()
{
n=read(),m=read(),s=read();
dsu d(n+3);
init();
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add(u,v),add(v,u);
}
for(int i=1;i<=m;i++)
{
int u=read(),v=read();
sdd(u,v),sdd(v,u);
}
tarjan(d,s);
for(int i=0;i<m;i++)
{
Edge &e=qed[i<<1];
print(e.LCA);
puts("");
}
}