import java.util.*;
/*
* 在有向图中遍历两点之间的所有路径,节点从0开始记
*/
public class Main {
static Scanner sc = new Scanner(System.in);
static int n,m;//顶点数,边数
static int start,end;//源点,终点
static List<Integer>[] g;//有向图的邻接矩阵
static List<Integer> stack;//栈
static boolean[][] visit;//路段ij是否已经走过
static void addE(int from,int to){//添加边
g[from].add(to);
}
static void vt(){//访问栈顶元素
if(stack.isEmpty())//栈为空,说明已经走完所有路径
System.exit(0);
else
dfs(stack.get(stack.size()-1));
}
static void dfs(int v){
if(v==end){//v是终点
System.out.println(stack.toString());
stack.remove(stack.size()-1);//把v弹出
vt();
}
else{//v不是终点
for(int i=0;i<g[v].size();i++){//遍历v的所有邻接点i
if(!visit[v][g[v].get(i)]){//若vi还未走过
visit[v][g[v].get(i)]=true;
stack.add(g[v].get(i));
dfs(g[v].get(i));
}
if(i==g[v].size()-1){//v的所有邻接点已经全部访问完
stack.remove(stack.size()-1);//把v弹出
vt();
}
}
}
}
static void init(){
n=sc.nextInt();
m=sc.nextInt();
start=sc.nextInt();
end=sc.nextInt();
g=new ArrayList[n];
for(int i=0;i<n;i++)
g[i]=new ArrayList<Integer>();
visit=new boolean[n][n];
for(int i=0;i<m;i++)
addE(sc.nextInt(),sc.nextInt());
stack=new ArrayList<Integer>();
}
public static void main(String[] args) {
init();
stack.add(start);
dfs(start);
}
}