#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,cnt,hd[10005],f[10005][31],d[10005],ru[10005];
struct Edge{
int to,nxt;
}edge[10005<<1];
void add(int u,int v)
{
cnt++;
edge[cnt].to=v;
edge[cnt].nxt=hd[u];
hd[u]=cnt;
}
void dfs(int u,int dep)
{
d[u]=dep;
for(int i=hd[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
dfs(v,dep+1);
}
}
int LCA(int x,int y)
{
int t=log2(d[x]-d[y]);
for(int i=t;i>=0;i--)
{
if(d[x]-(1<<i)>=d[y])
x=f[x][i];
}
if(x==y) return x;
t=log2(d[x]);
for(int i=t;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main()
{
int x,y;
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
f[y][0]=x;
ru[y]++;
}
for(int i=1;i<=n;i++)
for(int j=1;(1<<j)<=n;j++)
f[i][j]=f[f[i][j-1]][j-1];
int rt=0;
for(int i=1;i<=n;i++)
if(ru[i]==0) rt=i;
dfs(rt,0);
scanf("%d%d",&x,&y);
if(d[x]<d[y]) swap(x,y);
cout<<LCA(x,y);
}
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstdlib>
using namespace std;
int n,m,k,x,y,t,root,fa[1005],vis[1005],ru[1005];
vector <int> node[1005];
vector <int> que[1005];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
void LCA(int u)
{
for(int i=0;i<node[u].size();i++)
{
int v=node[u][i];
if(vis[u]) continue;
LCA(v);
fa[v]=u;
}
vis[u]=1;
for(int i=0;i<que[u].size();i++)
{
int w=que[u][i];
if(vis[w])
{
cout<<u<<","<<w<<","<<find(w)<<endl;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
node[x].push_back(y);
ru[y]++;
}
for(int i=1;i<=n;i++)
if(ru[i]==0){
root=i;
break;
}
for(int i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
que[x].push_back(y);
que[y].push_back(x);
}
for(int i=1;i<=n;i++)fa[i]=i;
LCA(root);
}