{
TASK:lab101
LANG:PASCAL
}

type switch = record
               x1, y1, x2, y2 : longint;
              end;

type point = record
              x, y : longint;
             end;


var a, used, used2, trap : array[0..11, 0..11] of longint;
    b : array[0..50] of switch;
    c : array[0..11, 0..11, 0..11, 0..11] of longint;
    op : array[0..200] of point;
    s, i, j, k, l, o, p, m, n : longint;
    min, xk, yk, xt, yt, x1, y1, x2, y2, xe, ye : longint;
    ch, be, en, fl, vl, pp : longint;


procedure input;
var f : text;
 begin
  assign(f, '');
  reset(f);
  readln(f, m, n);
  for i := 1 to m do
    begin
     for j := 1 to n do
       begin
        read(f, a[i, j]);
        if a[i, j] = 1 then a[i, j] := -1;
       end;
     readln(f);
    end;
  readln(f, pp);
  for i := 1 to pp do
    begin
     readln(f, b[i].x1, b[i].y1, b[i].x2, b[i].y2);
     trap[b[i].x2, b[i].y2] := 1;
    end;
  readln(f, x1, y1);
  readln(f, x2, y2);
  readln(f, xe, ye);
  close(f);
 end;


procedure preprocessing;
var i : longint;
 begin
  for i := 0 to m + 1 do
    begin
     a[i, 0] := -1;
     a[i, n + 1] := -1;
    end;
  for i := 0 to n + 1 do
    begin
     a[0, i] := -1;
     a[m + 1, i] := -1;
    end;
 end;

procedure bfs(x, y : integer);
var i, j : longint;
 begin
  for i := 1 to m do
    for j := 1 to n do
      used[i, j] := 0;
  be := 0;
  en := 1;
  op[1].x := x;
  op[1].y := y;
  used[x, y] := 1;
  repeat
   inc(be);
   x := op[be].x;
   y := op[be].y;
   if (used[x + 1, y] = 0) and (a[x + 1, y] <> -1) then
     begin
      used[x + 1, y] := used[x, y] + 1;
      inc(en);
      op[en].x := x + 1;
      op[en].y := y;
     end;
   if (used[x - 1, y] = 0) and (a[x - 1, y] <> -1) then
     begin
      used[x - 1, y] := used[x, y] + 1;
      inc(en);
      op[en].x := x - 1;
      op[en].y := y;
     end;
   if (used[x, y + 1] = 0) and (a[x, y + 1] <> -1) then
     begin
      used[x, y + 1] := used[x, y] + 1;
      inc(en);
      op[en].x := x;
      op[en].y := y + 1;
     end;
   if (used[x, y - 1] = 0) and (a[x, y - 1] <> -1) then
     begin
      used[x, y - 1] := used[x, y] + 1;
      inc(en);
      op[en].x := x;
      op[en].y := y - 1;
     end;
  until be >= en;
 end;

procedure bfs2(x, y : integer);
var i, j : longint;
 begin
  for i := 1 to m do
    for j := 1 to n do
      used2[i, j] := 0;
  be := 0;
  en := 1;
  op[1].x := x;
  op[1].y := y;
  used2[x, y] := 1;
  repeat
   inc(be);
   x := op[be].x;
   y := op[be].y;
   if (used2[x + 1, y] = 0) and (a[x + 1, y] <> -1) then
     begin
      used2[x + 1, y] := used2[x, y] + 1;
      inc(en);
      op[en].x := x + 1;
      op[en].y := y;
     end;
   if (used2[x - 1, y] = 0) and (a[x - 1, y] <> -1) then
     begin
      used2[x - 1, y] := used2[x, y] + 1;
      inc(en);
      op[en].x := x - 1;
      op[en].y := y;
     end;
   if (used2[x, y + 1] = 0) and (a[x, y + 1] <> -1) then
     begin
      used2[x, y + 1] := used2[x, y] + 1;
      inc(en);
      op[en].x := x;
      op[en].y := y + 1;
     end;
   if (used2[x, y - 1] = 0) and (a[x, y - 1] <> -1) then
     begin
      used2[x, y - 1] := used2[x, y] + 1;
      inc(en);
      op[en].x := x;
      op[en].y := y - 1;
     end;
  until be >= en;
 end;


procedure simulate1(xk, yk, xt, yt : longint);
 begin
  while (x1 <> xk) or (y1 <> yk) do
    begin
     if used[x1 + 1, y1] = used[x1, y1] - 1 then inc(x1)
     else if used[x1 - 1, y1] = used[x1, y1] - 1 then dec(x1)
     else if used[x1, y1 + 1] = used[x1, y1] - 1 then inc(y1)
     else if used[x1, y1 - 1] = used[x1, y1] - 1 then dec(y1);

     if used2[x2 + 1, y2] = used2[x2, y2] - 1 then inc(x2)
     else if used2[x2 - 1, y2] = used2[x2, y2] - 1 then dec(x2)
     else if used2[x2, y2 + 1] = used2[x2, y2] - 1 then inc(y2)
     else if used2[x2, y2 - 1] = used2[x2, y2] - 1 then dec(y2);
    end;
  a[xt, yt] := -1;
 end;

procedure simulate2(xk, yk, xt, yt : longint);
 begin
  while (x2 <> xk) or (y2 <> yk) do
    begin

     if used2[x2 + 1, y2] = used2[x2, y2] - 1 then inc(x2)
     else if used2[x2 - 1, y2] = used2[x2, y2] - 1 then dec(x2)
     else if used2[x2, y2 + 1] = used2[x2, y2] - 1 then inc(y2)
     else if used2[x2, y2 - 1] = used2[x2, y2] - 1 then dec(y2);

     if (x2 = xk) and (y2 = yk) then break;

     if used[x1 + 1, y1] = used[x1, y1] - 1 then inc(x1)
     else if used[x1 - 1, y1] = used[x1, y1] - 1 then dec(x1)
     else if used[x1, y1 + 1] = used[x1, y1] - 1 then inc(y1)
     else if used[x1, y1 - 1] = used[x1, y1] - 1 then dec(y1);


    end;
  a[xt, yt] := -1;
 end;








begin
 input;
 preprocessing;
 repeat
  fl := 0;
  bfs(xe, ye);
  if used[x1, y1] <= used[x2, y2] then fl := 1
  else fl := 2;
  s := used[x1, y1];
  if used[x2, y2] < s then s := used[x2, y2];
  if fl = 2 then
    begin
     vl := 0;
     for i := 1 to m do
       begin
        for j := 1 to n do
          if trap[i, j] = 1 then
            begin
             bfs(i, j);
             if used[x2, y2] + used[xe, ye] - 1 = s then
               begin
                trap[i, j] := 0;
                vl := 1;
                break;
               end;
            end;
        if vl = 1 then break;
       end;
     if vl = 0 then break;
     xt := i;
     yt := j;
     bfs(x1, y1);
     bfs2(x2, y2);
     min := 0;
     vl := 0;
     for i := 1 to pp do
       if (b[i].x2 = xt) and (b[i].y2 = yt) then
         begin
          if (used[b[i].x1, b[i].y1] < used2[b[i].x2, b[i].y2]) and (used2[b[i].x2, b[i].y2] - used[b[i].x1, b[i].y1] > min) then
            begin
             min := used2[b[i].x2, b[i].y2] - used[b[i].x1, b[i].y1];
             xk := b[i].x1;
             yk := b[i].y1;
             vl := 1;
            end;
         end;
     if vl = 0 then break;
     bfs(xk, yk);
     bfs2(xt, yt);
     simulate1(xk, yk, xt, yt);
     inc(ch);
     k := x1;
     x1 := x2;
     x2 := k;
     k := y1;
     y1 := y2;
     y2 := k;
    end
  else
    begin
     vl := 0;
     for i := 1 to m do
       begin
        for j := 1 to n do
          if trap[i, j] = 1 then
            begin
             bfs(i, j);
             if used[x1, y1] + used[xe, ye] - 1 = s then
               begin
                trap[i, j] := 0;
                vl := 1;
                break;
               end;
            end;
        if vl = 1 then break;
       end;
     if vl = 0 then break;
     xt := i;
     yt := j;
     bfs(x2, y2);
     bfs2(x1, y1);
     min := 0;
     vl := 0;
     for i := 1 to pp do
       if (b[i].x2 = xt) and (b[i].y2 = yt) then
         begin
          if (used[b[i].x1, b[i].y1] < used2[b[i].x2, b[i].y2]) and (used2[b[i].x2, b[i].y2] - used[b[i].x1, b[i].y1] > min) then
            begin
             min := used2[b[i].x2, b[i].y2] - used[b[i].x1, b[i].y1];
             xk := b[i].x1;
             yk := b[i].y1;
             vl := 1;
            end;
         end;
     if vl = 0 then break;
     bfs(xk, yk);
     bfs2(xt, yt);
     simulate2(xk, yk, xt, yt);
    end;
 until (vl = 0) or (s = 0);
 if s = 0 then writeln(0)
 else if (fl = 2) and (ch mod 2 = 1) then writeln(1)
 else if (fl = 2) and (ch mod 2 = 0) then writeln(2)
 else if (fl = 1) and (ch mod 2 = 1) then writeln(2)
 else if (fl = 1) and (ch mod 2 = 0) then writeln(1);
end.










