maxn=2010;maxv=4000010;
flag:array[0..3,0..1]of longint=((-1,0),(0,1),(1,0),(0,-1));
var
map:array[0..maxn,0..maxn]of char;
m,n,x1,x2,y1,y2,tail,head:longint;
que:array[0..maxv]of record
x,y,s:longint;
end;
procedure init;
var
i,j:longint;
begin
//assign(input,'maze.in');reset(input);
//assign(output,'maze.out');rewrite(output);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
read(map[i,j]);
readln;
end;
readln(x1,y1);
read(x2,y2);
end;
procedure print;
begin
writeln(que[tail].s);
//close(input);close(output);
end;
procedure print2;
begin
writeln('No Answer!');
//close(input);close(output);
end;
function check(x,y:longint):boolean;
begin
if (x<1)or(x>n)or(y<1)or(y>m) then exit(false);
if map[x,y]='0' then exit(true);
exit(false);
end;
procedure find(x,y:longint);
begin
inc(tail);
que[tail].x:=x;que[tail].y:=y; que[tail].s:=que[head].s+1;
if (x=x2)and(y=y2) then begin
print;
halt;
end;
map[x,y]:='1';
end;
procedure main;
var
xx,yy,i:longint;
begin
fillchar(que,sizeof(que),0);
head:=0;tail:=1;
que[1].x:=x1;que[1].y:=y1;map[x1,y1]:='1';
while head<>tail do
begin
inc(head);
xx:=que[head].x;yy:=que[head].y;
for i:=0 to 3 do
if check(xx+flag[i,0],yy+flag[i,1]) then find(xx+flag[i,0],yy+flag[i,1]);
end;
end;
begin
init;
main;
print2;
end.