#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>
#define MAXN 54010
using namespace std;
vector<int> g[MAXN],component[MAXN],criticals,solution;
stack<int> Stack;
int depth[MAXN],low[MAXN],components=0,seen[MAXN],isCritical[MAXN],access[MAXN];
int minimum(int a,int b){
if(a<b)
return a;
return b;
}
void CreateComponent(int node,int son){
if(access[son]==0){
while(!Stack.empty()&&Stack.top()!=son)
Stack.pop();
Stack.pop();
return;
}
components++;
criticals.push_back(node);
while(Stack.top()!=son){
component[components].push_back(Stack.top());
Stack.pop();
}
Stack.pop();
component[components].push_back(son);
component[components].push_back(node);
}
void DFS(int node,int father){
int i;
depth[node]=low[node]=depth[father]+1;
seen[node]=1;
for(i=0;i<g[node].size();i++)
if(g[node][i]!=father)
if(seen[g[node][i]]==0){
Stack.push(g[node][i]);
DFS(g[node][i],node);
low[node]=minimum(low[node],low[g[node][i]]);
access[node]|=access[g[node][i]];
if(low[g[node][i]]>=depth[node])
CreateComponent(node,g[node][i]);
}
else
low[node]=minimum(low[node],depth[g[node][i]]);
}
bool Hamilton(int level,int nodes,int node,int finish){
int i;
seen[node]=1;
if(level>1)
solution.push_back(node);
if(level==nodes){
if(finish==0||node==finish)
return true;
seen[node]=0;
solution.pop_back();
return false;
}
for(i=0;i<g[node].size();i++)
if(seen[g[node][i]]==0&&(level==nodes-1||g[node][i]!=finish)&&Hamilton(level+1,nodes,g[node][i],finish)==true)
return true;
seen[node]=false;
solution.pop_back();
return false;
}
void SolveBiconex(int index,int start,int finish){
int i;
for(i=0;i<component[index].size();i++)
seen[component[index][i]]=0;
if(Hamilton(1,component[index].size(),start,finish)==false){
printf("No chance");
exit(0);
}
}
int main(){
freopen("santa.in","r",stdin);
freopen("santa.out","w",stdout);
int n,m,i,x,y,s,e,q;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
scanf("%d%d%d",&s,&e,&q);
access[s]=1;
criticals.push_back(s);
DFS(e,0);
if(access[e]==0){
printf("No chance");
return 0;
}
if(find(component[1].begin(),component[1].end(),q)==component[1].end()){
reverse(component[1].begin()+1,component[1].end());
reverse(criticals.begin(),criticals.end());
}
if(find(component[1].begin(),component[1].end(),q)==component[1].end()){
printf("No chance");
return 0;
}
criticals[0]=q;
criticals.back()=0;
solution.push_back(q);
for(i=1;i<=components;i++)
SolveBiconex(i,criticals[i-1],criticals[i]);
printf("%d\n",solution.size());
for(i=0;i<solution.size();i++)
printf("%d ",solution[i]);
return 0;
}