/*
TASK:lab101
LANG:C++
*/

#include <stdio.h>
int N,M,P;
int a[105][14][14];

// key1 - kvadratcheto v momenta e neprohodimo
struct coord
{ int x,y; } key1[2][33],key2[2][33],P1,P2,D;
int k1,k2;

void input()
{ int i,j;
  int p1,p2,p3,p4;
  scanf("%d%d",&N,&M);
  for (i=1;i<=N;i++)
    for (j=1;j<=M;j++)
      scanf("%d",&a[0][i][j]);
  scanf("%d",&P);
  for (i=1;i<=P;i++)
   { scanf("%d%d%d%d",&p1,&p2,&p3,&p4);
     if (a[0][p3][p4]) { key1[0][++k1].x=p1; key1[0][k1].y=p2; key1[1][k1].x=p3; key1[1][k1].y=p4; }
      else { key2[0][++k2].x=p1; key2[0][k2].y=p2; key2[1][k2].x=p3; key2[1][k2].y=p4; }
   }
  scanf("%d%d",&P1.x,&P1.y);
  scanf("%d%d",&P2.x,&P2.y);
  scanf("%d%d",&D.x,&D.y);

  for (i=0;i<=11;i++)
    a[0][0][i]=a[0][N+1][i]=a[0][i][0]=a[0][i][M+1]=1;
}

int wave (int k, coord b,coord d)
{ coord Q[105],p;
  int l=-1,f=0;

  int m[15][15],i,j;
  for (i=0;i<=10;i++)
     for (j=0;j<=10;j++)
        m[i][j]=0;
  
  Q[++l]=b;
  m[b.x][b.y]=1;

  while(l>=f)
  { p=Q[f++];
    if ((!a[k][p.x+1][p.y])&&(!m[p.x+1][p.y]))
       { m[p.x+1][p.y]=m[p.x][p.y]+1;
         if (((p.x+1)==d.x)&&(p.y==d.y)) break;
         Q[++l].x=p.x+1;
         Q[l].y=p.y;
       }
    if ((!a[k][p.x-1][p.y])&&(!m[p.x-1][p.y]))
       { m[p.x-1][p.y]=m[p.x][p.y]+1;
         if (((p.x-1)==d.x)&&(p.y==d.y)) break;
         Q[++l].x=p.x-1;
         Q[l].y=p.y;
       }
    if ((!a[k][p.x][p.y+1])&&(!m[p.x][p.y+1]))
       { m[p.x][p.y+1]=m[p.x][p.y]+1;
         if ((p.x==d.x)&&((p.y+1)==d.y)) break;
         Q[++l].x=p.x;
         Q[l].y=p.y+1;
       }
    if ((!a[k][p.x][p.y-1])&&(!m[p.x][p.y-1]))
       { m[p.x][p.y-1]=m[p.x][p.y]+1;
         if ((p.x==d.x)&&((p.y-1)==d.y)) break;
         Q[++l].x=p.x;
         Q[l].y=p.y-1;
       }
  }
  if (m[d.x][d.y]) return m[d.x][d.y];
     else return 107;
}
          
void copy (int k)
{ int i,j;
  for (i=0;i<=N+1;i++)
   for (j=0;j<=M+1;j++)
    a[k+1][i][j]=a[k][i][j];
}

int solve (int k,int L,int W,coord pl,coord pw,int ppl,int ppw)
{ int i,ppl1,ppw1;
  for (i=1;i<=k2;i++)
   if (wave(k,pl,key2[0][i])<wave(k,pw,key2[1][i]))
    { copy(k);
      a[k+1][key2[1][i].x][key2[1][i].y]=1;
      ppl1=wave(k+1,pl,key2[0][i])+wave(k+1,key2[0][i],D);
      ppw1=wave(k+1,pw,D);
      if (ppl1<ppw1) return 1;
      a[k+1][key2[1][i].x][key2[1][i].y]=0;
    }
  for (i=1;i<=k1;i++)
   { copy(k);
     a[k+1][key1[1][i].x][key1[1][i].y]=0;
     if (wave(k+1,pl,key1[0][i])<ppw) return 1;
     a[k+1][key1[1][i].x][key1[1][i].y]=1;
   }
  return 0;
}

int main ()
{ input();
  int pp1=wave(0,P1,D);
  int pp2=wave(0,P2,D);
  if (pp1>pp2)
      if (solve(0,1,2,P1,P2,pp1,pp2)) printf("1\n");
        else printf("2\n");
   else
     if (solve(0,2,1,P2,P1,pp2,pp1)) printf("2\n");
        else printf("1\n");
  return 0;
}



