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

#include <cstdio>
#include <algorithm>
#include <queue>

#define maxp (1<<11)*101*101
#define maxmn 10

using namespace std;

long m,n,a[maxmn][maxmn],p,b[maxmn][maxmn],pos1,pos2,targ;
long bit[maxmn][maxmn];
char data[maxp],vis[maxp],vis1[maxp];

long pos(long x,long y)
{ return x*m+y;
}
long oplll(long t)
{ if (t==1) return 0;
  return 1;
}
void sop(long pos,long &x,long &y)
{ y=pos%m;
  x=pos/m;
}
void inp(void)
{ long i,j,x,y,z,t;
  scanf("%ld%ld",&n,&m);
  for (i=0;i<n;i++)
  for (j=0;j<m;j++) b[i][j]=-1;
  for (i=0;i<n;i++)
  for (j=0;j<m;j++)  scanf("%ld",&a[i][j]);
  scanf("%ld",&p);
  for (i=0;i<p;i++)
  { scanf("%ld%ld%ld%ld",&x,&y,&z,&t);
    x--;y--;z--;t--;
    b[x][y]=pos(z,t);
  }
  scanf("%ld%ld%ld%ld",&x,&y,&z,&t);
  x--;y--;z--;t--;
  pos1=pos(x,y);
  pos2=pos(z,t);
  scanf("%ld%ld",&x,&y);
  x--;y--;
  targ=pos(x,y);
}
long code(long sit,long p1,long p2,long t)
{ if (t) return ((sit*2+t)*101+p1)*101+p2;
  else return ((sit*2+t)*101+p2)*101+p1;
}
void decode(long c,long &sit,long &p1,long &p2,long &t)
{ p2=c%101;
  c/=101;
  p1=c%101;
  c/=101;
  t=c%2;
  sit=c>>1;
}
void init(void)
{ long i,j,k=0,x,y;
  memset(vis,0,sizeof(vis));
  memset(vis1,0,sizeof(vis1));
  for (i=0;i<n;i++)
  for (j=0;j<m;j++) { bit[i][j]=-1;}
  for (i=0;i<n;i++)
  for (j=0;j<m;j++) if (b[i][j]!=-1)
  { sop(b[i][j],x,y);
    if (bit[x][y]==-1) bit[x][y]=k++;
  }
  x=targ;
  for (i=0;i<(1<<10);i++)
  for (y=0;y<=pos(n-1,m-1);y++) if (y!=targ)
  { data[code(i,x,y,1)]=-1;
    vis[code(i,x,y,1)]=1;
  }
  x=targ;
  for (i=0;i<(1<<10);i++)
  for (y=0;y<=pos(n-1,m-1);y++) if (y!=targ)
  { data[code(i,y,x,0)]=-1;
    vis[code(i,y,x,0)]=1;
  }
}
bool closed(long sit,long x,long y)
{ long bb=0,m;
  if (bit[x][y]!=-1)
  { m=1<<bit[x][y];
    bb=sit&m;
    if (bb) bb=1;
  }
  return a[x][y]^bb;
}
long newsit(long sit,long xpl,long ypl,long x1pl,long y1pl,long opl)
{ long x,y,m;
  if (b[xpl][ypl]==-1) return sit;
  if (b[xpl][ypl]==opl) return sit;
  sop(b[xpl][ypl],x,y);
  m=1<<bit[x][y];
  sit^=m;
  return sit;
}
long dfs(long s)
{ long x[2],y[2],sit,t,pp[2],sit1,next1,u,opl;
  if (vis[s]) return data[s];
  if (vis1[s]) return 0;
  data[s]=-1;
  decode(s,sit,pp[0],pp[1],t);
  opl=t^1;
  sop(pp[0],x[0],y[0]);
  sop(pp[1],x[1],y[1]);
  if ((x[t]>0) && !closed(sit,x[t]-1,y[t]))
  { sit1=newsit(sit,x[t]-1,y[t],x[opl],y[opl],pp[opl]);
    next1=code(sit1,pos(x[t]-1,y[t]),pp[opl],opl);
    vis1[s]=1;
    u=dfs(next1);
    if (u==-1)
    { data[next1]=1;
      vis[next1]=1;
      vis1[s]=0;
      return 1;
    }
    if (u==0 &&data[next1]==-1) data[next1]=0;
    vis1[s]=0;
  }
  if ((y[t]>0) && !closed(sit,x[t],y[t]-1))
  { sit1=newsit(sit,x[t],y[t]-1,x[opl],y[opl],pp[opl]);
    next1=code(sit1,pos(x[t],y[t]-1),pp[opl],opl);
    vis1[s]=1;
    u=dfs(next1);
    if (u==-1)
    { data[next1]=1;
      vis[next1]=1;
      vis1[s]=0;
      return 1;
    }
    if (u==0 &&data[next1]==-1) data[next1]=0;
    vis1[s]=0;
  }
  if ((y[t]<m-1) && (!closed(sit,x[t],y[t]+1)))
  { sit1=newsit(sit,x[t],y[t]+1,x[opl],y[opl],pp[opl]);
    next1=code(sit1,pos(x[t],y[t]+1),pp[opl],opl);
    vis1[s]=1;
    u=dfs(next1);
    if (u==-1)
    { data[next1]=1;
      vis[next1]=1;
      vis1[s]=0;
      return 1;
    }
    if (u==0 &&data[next1]==-1) data[next1]=0;
    vis1[s]=0;
  }
  if ((x[t]<n-1) && !closed(sit,x[t]+1,y[t]))
  { sit1=newsit(sit,x[t]+1,y[t],x[opl],y[opl],pp[opl]);
    next1=code(sit1,pos(x[t]+1,y[t]),pp[opl],opl);
    vis1[s]=1;
    u=dfs(next1);
    if (u==-1)
    { data[next1]=1;
      vis[next1]=1;
      vis1[s]=0;
      return 1;
    }
    if (u==0 &&data[next1]==-1) data[next1]=0;
    vis1[s]=0;
  }
  vis[s]=1;
  return data[s];
}
int main(void)
{ long i,j;
//  freopen("lab.inp","r",stdin);
  inp();
  init();
  i=dfs(code(0,pos2,pos1,0));
  if (i==1) printf("1\n");
  else if (i==-1) printf("2\n");
  else printf("0\n");
  return 0;
}

