program knight2;
const maxsize=1000;

type pqueue=^queue;
queue=record
x,y:longint;
c:longint;
next:pqueue;
end;

var a:array[1..maxsize,1..maxsize] of byte;
{1 под боем первой фигуры, 2 под боем второй фигуры 4 занято}
    i,j,k,l,p,q,r,s,m,n,res:longint;
    startx,starty,finishx,finishy,fig1x,fig1y,fig2x,fig2y,cod1,cod2:longint;
var head,tail:pqueue;

procedure put(p,cod,x,y:longint);
var i,j,x0,y0:longint;
    flag:boolean;
begin
if (x=fig1x) and (y=fig1y)
   then begin
        x0:=fig2x;
        y0:=fig2y;
        end
   else begin
        x0:=fig1x;
        y0:=fig1y;
        end;
flag:=true;
{(1 - король, 2 - ферзь,3 - ладья, 4 - конь, 5 - слон) }
case cod of
  1: begin  {король}
     if x>1
        then inc(a[x-1,y],p);
     if x<m
        then inc(a[x+1,y],p);
     if y>1
        then inc(a[x,y-1],p);
     if y<n
        then inc(a[x,y+1],p);
     if (x>1) and (y>1)
        then inc(a[x-1,y-1],p);
     if (x>1) and (y<n)
        then inc(a[x-1,y+1],p);
     if (x<m) and (y>1)
        then inc(a[x+1,y-1],p);
     if (x<m) and (y<n)
        then inc(a[x+1,y+1],p);
     end;
  2: begin    {ферзь}
     j:=y-1;
     flag:=true;
     while (j>=1) and flag do
           begin
           inc(a[x,j],p);
           flag:=(x0<>x) or (y0<>j);
           dec(j);
           end;
     j:=y+1;
     flag:=true;
     while (j<=n) and flag do
           begin
           inc(a[x,j],p);
           flag:=(x0<>x) or (y0<>j);
           inc(j);
           end;
     i:=x+1;
     flag:=true;
     while (i<=m) and flag do
           begin
           inc(a[i,y],p);
           flag:=(x0<>i) or (y0<>y);
           inc(i);
           end;
     i:=x-1;
     flag:=true;
     while (i>=1) and flag do
           begin
           inc(a[i,y],p);
           flag:=(x0<>i) or (y0<>y);
           dec(i);
           end;
     i:=x-1;
     j:=y-1;
     flag:=true;
     while (i>=1) and (j>=1) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           dec(i);
           dec(j);
           end;
     i:=x-1;
     j:=y+1;
     flag:=true;
     while (i>=1) and (j<=n) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           dec(i);
           inc(j);
           end;
     i:=x+1;
     j:=y-1;
     flag:=true;
     while (i<=m) and (j>=1) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           inc(i);
           dec(j);
           end;
     i:=x+1;
     j:=y+1;
     flag:=true;
     while (i<=m) and (j<=n) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           inc(i);
           inc(j);
           end;
     end;
  3: begin  {ладья}
     j:=y-1;
     flag:=true;
     while (j>=1) and flag do
           begin
           inc(a[x,j],p);
           flag:=(x0<>x) or (y0<>j);
           dec(j);
           end;
     j:=y+1;
     flag:=true;
     while (j<=n) and flag do
           begin
           inc(a[x,j],p);
           flag:=(x0<>x) or (y0<>j);
           inc(j);
           end;
     i:=x+1;
     flag:=true;
     while (i<=m) and flag do
           begin
           inc(a[i,y],p);
           flag:=(x0<>i) or (y0<>y);
           inc(i);
           end;
     i:=x-1;
     flag:=true;
     while (i>=1) and flag do
           begin
           inc(a[i,y],p);
           flag:=(x0<>i) or (y0<>y);
           dec(i);
           end;
     end;
  4: begin  {(конь}
     if (x>2) and (y>1)
        then inc(a[x-2,y-1],p);
     if (x>1) and (y>2)
        then inc(a[x-1,y-2],p);
     if (x>1) and (y<=n-2)
        then inc(a[x-1,y+2],p);
     if (x>2) and (y<=n-1)
        then inc(a[x-2,y+1],p);
     if (x<=m-2) and (y>1)
        then inc(a[x+2,y-1],p);
     if (x<=m-1) and (y>2)
        then inc(a[x+1,y-2],p);
     if (x<=m-1) and (y<=n-2)
        then inc(a[x+1,y+2],p);
     if (x<=m-2) and (y<=n-1)
        then inc(a[x+2,y+1],p);
     end;
  5: begin  {слон}
     i:=x-1;
     j:=y-1;
     flag:=true;
     while (i>=1) and (j>=1) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           dec(i);
           dec(j);
           end;
     i:=x-1;
     j:=y+1;
     flag:=true;
     while (i>=1) and (j<=n) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           dec(i);
           inc(j);
           end;
     i:=x+1;
     j:=y-1;
     flag:=true;
     while (i<=m) and (j>=1) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           inc(i);
           dec(j);
           end;
     i:=x+1;
     j:=y+1;
     flag:=true;
     while (i<=m) and (j<=n) and flag do
           begin
           inc(a[i,j],p);
           flag:=(x0<>i) or (y0<>j);
           inc(i);
           inc(j);
           end;
     end;
  end;    {case}
end;

procedure init;
begin
fillchar(a,sizeof(a),0);
put(1,cod1,fig1x,fig1y);
put(2,cod2,fig2x,fig2y);
end;

procedure add(x0,y0,c0:longint);
var pp:pqueue;
begin
new(pp);
a[x0,y0]:=4;
pp^.next:=nil;
pp^.x:=x0;
pp^.y:=y0;
pp^.c:=c0;
tail^.next:=pp;
tail:=pp;
end;

procedure del;
var pp:pqueue;
begin
pp:=head;
if head<>nil
   then begin
        head:=head^.next;
        dispose(pp);
        end;
end;

function find(x1,y1,x2,y2,c:longint):longint;
{x1,y1 - начало ,x2,y2 - конец с -черные фигуры}
var i,j,d:longint;
begin
init;
new(head);
head^.next:=nil;
head^.x:=x1;
head^.y:=y1;
head^.c:=0;
tail:=head;
a[x1,y1]:=4;
while (head<>nil) and not((head^.x=x2) and (head^.y=y2)) do
      begin
      i:=head^.x;
      j:=head^.y;
      d:=head^.c+1;
      a[i,j]:=4;
      if (i>2) and (j>1) and (a[i-2,j-1] and c=0)
        then begin
             add(i-2,j-1,d);
             end;
      if (i>1) and (j>2) and (a[i-1,j-2] and c=0)
        then begin
             add(i-1,j-2,d);
             end;
      if (i>1) and (j<=n-2) and (a[i-1,j+2] and c=0)
        then begin
             add(i-1,j+2,d);
             end;
      if (i>2) and (j<=n-1) and (a[i-2,j+1] and c=0)
        then begin
             add(i-2,j+1,d);
             end;
      if (i<=m-2) and (j>1) and (a[i+2,j-1] and c=0)
        then begin
             add(i+2,j-1,d);
             end;
      if (i<=m-1) and (j>2) and (a[i+1,j-2] and c=0)
        then begin
             add(i+1,j-2,d);
             end;
      if (i<=m-1) and (j<=n-2) and (a[i+1,j+2] and c=0)
        then begin
             add(i+1,j+2,d);
             end;
      if (i<=m-2) and (j<=n-1) and (a[i+2,j+1] and c=0)
        then begin
             add(i+2,j+1,d);
             end;
      del;
      end;
if head=nil
   then find:=m*n+1
   else begin
        find:=head^.c;
        while head<>nil do
              del;
        end;
end;

begin
{assign(input,'input.txt');
reset(input);}
read(m,n,cod1,fig1x,fig1y,cod2,fig2x,fig2y,startx,starty,finishx,finishy);
res:=find(startx,starty,finishx,finishy,7); {не берем фигуры}
i:=find(startx,starty,fig1x,fig1y,7); {берем сначала первую}
j:=find(startx,starty,fig2x,fig2y,7); {берем сначала вторую}
k:=find(fig1x,fig1y,finishx,finishy,6); {после первой вторую не берем}
l:=find(fig1x,fig1y,fig2x,fig2y,6); {после первой берем и вторую}
p:=find(fig2x,fig2y,finishx,finishy,5); {после второй первую не берем}
q:=find(fig2x,fig2y,fig1x,fig1y,5); {после второй берем первую}
r:=find(finishx,finishy,fig1x,fig1y,4);
s:=find(finishx,finishy,fig2x,fig2y,4);
if i+k<res
   then res:=i+k; {первую берем, вторую не берем}
if j+p<res
   then res:=j+p; {первую не берем, вторую берем}
if i+l+s<res
   then res:=i+l+s; {сначала берем первую, потом вторую}
if j+q+r<res
   then res:=j+q+r; {сначала берем вторую, потом первую}
if res>m*n
   then res:=-1;
writeln(res);
end.
