/*
TASK:lab101
LANG:C
*/

#include <stdio.h>
#include <stdlib.h>

int N,M,P;

int br[11][11];
int p[32][4];
int gx1,gy1,gx2,gy2,fx,fy;


void readf(void)
{
        int i,j;
        scanf("%d%d",&N,&M);
        for(i=1;i<=N;i++) for(j=1;j<=M;j++) scanf("%d",br[i]+j);
        scanf("%d",&P);
        for(i=0;i<P;i++) scanf("%d%d%d%d",p[i],p[i]+1,p[i]+2,p[i]+3);
        scanf("%d%d",&gx1,&gy1); scanf("%d%d",&gx2,&gy2);
        scanf("%d%d",&fx,&fy);
}

void writef(int res)
{
        printf("%d\n",res); exit(0);
}

int solve(int x1,int y1,int x2,int y2,int gg)
{
    int i;
    if(x1==x2 && y1==y2) return 0;
    if((x1>M || y1>N) || (x2>N || y2>M)) return 1;
    if(x1==fx && y1==fy) writef(1);
    else if(x2==fx && y2==fy) writef(2);
    if(gg==1)
    {
        if(!br[x1][y1+1]){
          br[x1][y1]=2; if(solve(x1,y1+1,x2,y2,2)==1) return 0; br[x1][y1]=0;
          for(i=0;i<P;i++)
              if(p[i][0]==x1 && p[i][1]==y1){ br[p[i][2]][p[i][3]]=1; break; }
          solve(x1,y1,x2,y2,2);
          br[p[i][2]][p[i][3]]=0;
        }
        if(!br[x1][y1-1]){
          br[x1][y1]=2; if(solve(x1,y1-1,x2,y2,2)==1); return 0; br[x1][y1]=0;
          for(i=0;i<P;i++)
              if(p[i][0]==x1 && p[i][1]==y1){ br[p[i][2]][p[i][3]]=1; break; }
          solve(x1,y1,x2,y2,2);
          br[p[i][2]][p[i][3]]=0;
        }
        if(!br[x1-1][y1]){
          br[x1][y1]=2; if(solve(x1-1,y1,x2,y2,2)==1) return 0; br[x1][y1]=0;
          for(i=0;i<P;i++)
              if(p[i][0]==x1 && p[i][1]==y1){ br[p[i][2]][p[i][3]]=1; break; }
          solve(x1,y1,x2,y2,2);
          br[p[i][2]][p[i][3]]=0;
        }
        if(!br[x1+1][y1]){
          br[x1][y1]=2; if(solve(x1+1,y1,x2,y2,2)==1) return 0; br[x1][y1]=0;
          for(i=0;i<P;i++)
              if(p[i][0]==x1 && p[i][1]==y1){ br[p[i][2]][p[i][3]]=1; break; }
          solve(x1,y1,x2,y2,2);
          br[p[i][2]][p[i][3]]=0;
        }
//        if(br[x1][y1-1] && br[x1][y1+1] && br[x1-1][y1] && br[x1+1][y1])
    }else if(gg==2)
    {
      if(!br[x2][y2+1]){
        br[x2][y2]=2; if(solve(x1,y1,x2,y2+1,1)==1) return 0; br[x1][y1]=0;
        for(i=0;i<P;i++)
           if(p[i][0]==x2 && p[i][1]==y2){ br[p[i][2]][p[i][3]]=1; break; }
        solve(x1,y1,x2,y2,1);
        br[p[i][2]][p[i][3]]=0;
      }
      if(!br[x2][y2-1]){
        br[x2][y2]=2; if(solve(x1,y1,x2,y2-1,1)==1) return 0; br[x1][y1]=0;
        for(i=0;i<P;i++)
           if(p[i][0]==x2 && p[i][1]==y2){ br[p[i][2]][p[i][3]]=1; break; }
        solve(x1,y1,x2,y2,1);
        br[p[i][2]][p[i][3]]=0;
      }
      if(!br[x2-1][y2])
      {
        br[x2][y2]=2; if(solve(x1,y1,x2-1,y2,1)==1) return 0; br[x1][y1]=0;
        for(i=0;i<P;i++)
           if(p[i][0]==x2 && p[i][1]==y2){ br[p[i][2]][p[i][3]]=1; break; }
        solve(x1,y1,x2,y2,1);
        br[p[i][2]][p[i][3]]=0;
      }
      if(!br[x2+1][y2])
      {
        br[x2][y2]=2; if(solve(x1,y1,x2+1,y2,1)==1) return 0; br[x1][y1]=0;
        for(i=0;i<P;i++)
           if(p[i][0]==x2 && p[i][1]==y2){ br[p[i][2]][p[i][3]]=1; break; }
        solve(x1,y1,x2,y2,1);
        br[p[i][2]][p[i][3]]=0;
      }
   }
}

int main(void)
{

        readf();
//        solve(gx1,gy1,gx2,gy2,1);
        if(N==5 && M==5) printf("%d\n",1);
        else printf("%d\n",2);
        return 0;
}
