#include<stdio.h>
#include<string.h>
#include<vector>
#include<map>
#include<queue>
#include<iostream>
#define sz 3300
using namespace std;
map<string,int>mp;
map<int,string>mp1;
int par[sz];
bool color[sz];
vector<int>adj[sz];
int tag,flag;
string source,dest;
vector<int>vec;
void bfs(int s)
{
memset(color,false,sizeof(color));
queue<int>Q;
color[s]=1;
Q.push(s);
int a;
while (!Q.empty())
{
int u=Q.front();
Q.pop();
for (int i=0; i<adj[u].size(); i++)
{
a=adj[u][i];
if(color[a]==0)
{
color[a]=1;
Q.push(a);
par[a]=u;
}
}
}
return ;
}
void path(int v)
{
if (mp[source]==v)
{
vec.push_back(v);
return;
}
else if (par[v]==0)
{
flag = 1;
return;
}
else
{
path(par[v]);
vec.push_back(v);
}
return ;
}
int main()
{
int n,i,j,tc=0;
string s,s1;
while(scanf("%d",&n)!=EOF)
{
tag=0;
mp.clear();
mp1.clear();
vec.clear();
memset(par,0,sizeof(par));
if(tc)
{
printf("\n");
}
for(i=1; i<=n; i++)
{
cin>>s>>s1;
if(mp.find(s)==mp.end())
{
mp[s]=++tag;
mp1[tag]=s;
}
if(mp.find(s1)==mp.end())
{
mp[s1]=++tag;
mp1[tag]=s1;
}
adj[mp[s]].push_back(mp[s1]);
adj[mp[s1]].push_back(mp[s]);
}
cin>>source>>dest;
if(mp.find(source)==mp.end())
{
mp[source]=++tag;
mp1[tag]=source;
}
if(mp.find(dest)==mp.end())
{
mp[dest]=++tag;
mp1[tag]=dest;
}
bfs(mp[source]);
flag=0;
path(mp[dest]);
if(flag)
{
printf("No route\n");
}
else
{
if(vec.size()==1)
{
cout<<mp1[vec[0]]<<" "<<mp1[vec[0]]<<"\n";
}
else
{
for(i=0; i<vec.size()-1; i++)
{
cout<<mp1[vec[i]]<<" "<<mp1[vec[i+1]]<<"\n";
}
}
}
tc=1;
for(i=0;i<=tag;i++)
{
adj[i].clear();
}
}
return 0;
}