#include<iostream>
using namespace std;
struct arc {
int subscript;
arc* next;
};
struct point {
char data;
arc* first;
};
struct list {
point p[100];
int np, na;
};
bool visited[100];
int FirstAdjVex(list L, int f)
{
if (L.p[f].first == NULL)return -1;
return L.p[f].first->subscript;
}
int NextAdjVex(list L, int f, int w) {
arc* p1 = L.p[f].first;
while (p1 != NULL) {
if (p1->subscript == w && p1->next != NULL)
return p1->next->subscript;
p1 = p1->next;
}return -1;
}
void DFS(list L, int f) {
cout << f<<" "; visited[f] = true;
for (int w = FirstAdjVex(L,f); w >= 0; w = NextAdjVex(L, f, w))
if (!visited[w])
DFS(L, w);
}
int LocateVex(list L, char c){
for (int i = 0; i < 100; i++) {
if (L.p[i].data == c)return i;
}return -1;
}
void Create(list& L,int &f){
cin >> L.np >> L.na;
for (int i = 0; i < L.np; i++){
visited[i] = false;
cin >> L.p[i].data;
L.p[i].first = NULL;
}
for (int k = 0; k < L.na; k++)
{
char n, m;
cin >> n >> m;
int i = LocateVex(L, n), j = LocateVex(L, m);
arc* p1 = new arc;
p1->subscript = j;
p1->next = L.p[i].first;
L.p[i].first = p1;
} char c; cin >> c;
f = LocateVex(L, c);
}
int main()
{
list L; int f;Create(L, f);
if (L.np == 0 || L.np == 1 && L.na > 1)cout << "error";
else {
if(LocateVex(L,f)==-1||FirstAdjVex(L,f)==-1)cout<<"error";
else DFS(L, f);
}
}