#include<bits/stdc++.h>
using namespace std;
const int N=10100;
int n,e;
vector<int> adj[N];
bool book[N];
void dfs(int u){
book[u]=1;
cout<<u<<" ";
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
if(book[v]==0) dfs(v);
}
}
int main(){
cin>>n>>e;
for(int i=0;i<e;i++){
int a,b;
cin>>a>>b;
adj[a].push_back(b);
}
for(int i=0;i<n;i++) sort(adj[i].begin() ,adj[i].end() );
for(int i=0;i<n;i++)
if(book[i]==0) dfs(i);
return 0;
}
//记录路径
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
typedef pair<int,int> pii;
int g[N][N],book[N][N];
int n;
struct path{
int x,y;
}path[N][N];//记录它的上一个
int x1,x2,y1,y2;
int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={1,1,0,-1,-1,-1,0,1};
void bfs(){
queue<pii> qu;
qu.push({x1,y1});
book[x1][y1]=1;
while(qu.size()){
pii now=qu.front() ;
qu.pop() ;
for(int i=0;i<8;i++){
int xx=now.first +dx[i];
int yy=now.second +dy[i];
if(xx<0||xx>=n||yy<0||yy>=n) continue;
if(g[xx][yy]==0 && book[xx][yy]==0){
book[xx][yy]=1;
qu.push({xx,yy});
path[xx][yy].x=now.first;
path[xx][yy].y=now.second;
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>g[i][j];
}
}
cin>>x1>>y1>>x2>>y2;
bfs();
while(1){
printf("%d %d;",x2,y2);
if(x2==x1&&y2==y1) break;
int x3=x2,y3=y2;
x2=path[x3][y3].x;
y2=path[x3][y3].y;
}
return 0;
}