/*
TASK:lab101
LANG:C
*/

#include <stdio.h>
#define INF 13371337
FILE *in; FILE *out;
int map[12][12];
int n, m;
int ans = 0;
int keys[32][4]; int kk;
int p1[2], p2[2];
int ex, ey;
int a[12][12][12][12];


int finddist(int fx, int fy, int tox, int toy)
{
int i, c;
int tail[128][3]; int len;
int x, y;
int vis[12][12];

for (i=0; i<12; i++) for (c=0; c<12; c++) vis[i][c] = map[i][c];
tail[0][0] = fx; tail[0][1] = fy; tail[0][2] = 0; len = 1;
vis[fx][fy] = 1; 

for (i=0; i<len; i++)
    {
    x = tail[i][0]; y = tail[i][1];
    if (tox == x && toy == y) return tail[i][2];
    else
        {
        if (!vis[x+1][y])
           {
           if (x+1 == tox && y == toy) return tail[i][2]+1;
           vis[x+1][y] = 1;
           tail[len][0] = x+1; tail[len][1] = y; tail[len][2] = tail[i][2]+1; len++;
           }

        if (!vis[x-1][y])
           {
           if (x-1 == tox && y == toy) return tail[i][2]+1;
           vis[x-1][y] = 1;
           tail[len][0] = x-1; tail[len][1] = y; tail[len][2] = tail[i][2]+1; len++;
           }

        if (!vis[x][y+1])
           {
           if (x == tox && y+1 == toy) return tail[i][2]+1;
           vis[x][y+1] = 1;
           tail[len][0] = x; tail[len][1] = y+1; tail[len][2] = tail[i][2]+1; len++;
           }

        if (!vis[x+1][y-1])
           {
           if (x == tox && y-1 == toy) return tail[i][2]+1;
           vis[x][y-1] = 1;
           tail[len][0] = x; tail[len][1] = y-1; tail[len][2] = tail[i][2]+1; len++;
           }
        }
    }

return INF;
}


void init(void)
{
int i, c;

for (i=0; i<12; i++) for (c=0; c<12; c++) map[i][c] = 1;

return;
}

void scan(void)
{
int i, c;
int tmp;

fscanf(in, "%d %d", &n, &m);
for (i=1; i<=n; i++) for (c=1; c<=m; c++)
    {
    fscanf(in, "%d", &tmp);
    map[i][c] = tmp;
    }
fscanf(in, "%d", &kk);
for (i=0; i<kk; i++)
    {
    fscanf(in, "%d %d", &keys[i][0], &keys[i][1]);
    fscanf(in, "%d %d", &keys[i][2], &keys[i][3]);
    }

fscanf(in, "%d %d", &p1[0], &p1[1]);
fscanf(in, "%d %d", &p2[0], &p2[1]);

fscanf(in, "%d %d", &ex, &ey);

return;
}


void prnt(void)
{
int i, c;

/*
for (i=0; i<12; i++)
    {
    for (c=0; c<12; c++) fprintf(out, "%d ", map[i][c]);
    fprintf(out, "\n");
    }
*/
fprintf(out, "%d\n", ans);


return;
}



int recurse(int player)
{
int i, c;
int k, j;
int win, tmp, t, mt;
int svp1[2]; int svp2[2];
int flag = 0;

svp1[0] = p1[0]; svp1[1] = p1[1];
svp2[0] = p2[0]; svp2[1] = p2[1];
mt = INF;

// For player 1... //

if (player == 1)
   {
   for (i=0; i<kk; i++)
       {
       tmp = a[p1[0]][p1[1]][keys[i][0]][keys[i][1]];
       if (tmp > a[p2[0]][p2[1]][keys[i][2]][keys[i][3]])
          {
          continue;
          }
       else
          {
          flag = 1;
          map[keys[i][2]][keys[i][3]] += 1; map[keys[i][2]][keys[i][3]]%=2;
          
          for (j=1; j<=n; j++)
              {
              for (k=1; k<=m; k++)
                  {
                  if (a[p2[0]][p2[1]][j][k] == tmp)
                     {
                     t = finddist(j, k, ex, ey);
                     if (t<mt) {mt = t;}
                     }
                  }
              }
          if (mt == INF) {ans = 0; return 0;}
          else
              {
              if (finddist(keys[i][0], keys[i][1], ex, ey) <= mt) {return 1;}
              else return 2;
              }

          map[keys[i][2]][keys[i][3]] += 1; map[keys[i][2]][keys[i][3]]%=2;
          }
       }
   if (flag == 0) return 2;
   }

// For player 2... //

mt = INF; flag = 0;

if (player == 2)
   {
   for (i=0; i<kk; i++)
       {
       tmp = a[p2[0]][p2[1]][keys[i][0]][keys[i][1]];
       if (tmp > a[p1[0]][p1[1]][keys[i][2]][keys[i][3]])
          {
          continue;
          }
       else
          {
          flag = 1;
          map[keys[i][2]][keys[i][3]] += 1; map[keys[i][2]][keys[i][3]]%=2;
          
          for (j=1; j<=n; j++)
              {
              for (k=1; k<=m; k++)
                  {
                  if (a[p1[0]][p1[1]][j][k] == tmp)
                     {
                     t = finddist(j, k, ex, ey);
                     if (t<mt) mt = t;
                     }
                  }
              }
          if (mt == INF) {ans = 0; return 0;}
          else
              {
              if (finddist(keys[i][0], keys[i][1], ex, ey) <= mt) {return 2;}
              else return 1;
              }

          map[keys[i][2]][keys[i][3]] += 1; map[keys[i][2]][keys[i][3]]%=2;
          }
       }
   if (flag == 0) return 1;
   }


return 0;
}





void dwrk(void)
{
int i, c;
int k, j;
int min1 = 1337, min2 = 1337;
int kpush[32];

for (i=0; i<32; i++) kpush[i] = 0;

for (i=1; i<=n; i++)
    for (c=1; c<=m; c++)
        for (j=1; j<=n; j++)
            for (k=1; k<=m; k++)
                {
                a[i][c][j][k] = finddist(i, c, j, k);
                }

k = a[p1[0]][p1[1]][ex][ey];
j = a[p2[0]][p2[1]][ex][ey];

if (kk == 0)
   {
   if (k == INF && j == INF) {ans = 0; return;}
   if (k == INF) {ans = 2; return;}
   if (j == INF) {ans = 1; return;}
   
   if (k <= j) {ans = 1; return;}
   if (j <  k) {ans = 2; return;}
   }

else 
   {
   for (i=0; i<kk; i++)
       {
       c = a[p1[0]][p1[1]][keys[i][0]][keys[i][1]];
       if (c<min1) min1 = c;
       }
   
   for (i=0; i<kk; i++)
       {
       c = a[p2[0]][p2[1]][keys[i][0]][keys[i][1]];
       if (c<min2) min2 = c;
       }
   
   if (k <= j)
      {
      if (k<=min2) {ans = 1; return;}
      }
   else
      {
      if (j<min1) {ans = 2; return;}
      }
   }


if (j == INF && k == INF)
   {
   for (i=0; i<kk; i++)
       {
       if (map[keys[i][2]][keys[i][3]] == 1)
          {
          kpush[i] = 1;
          map[keys[i][2]][keys[i][3]] = 0;
          }
       }
   i = finddist(p1[0], p1[1], ex, ey);
   c = finddist(p2[0], p2[1], ex, ey);
   if (i == INF && c == INF) {ans = 0; return;}
   else
       {
       for (i=0; i<kk; i++) if (kpush[i]) map[keys[i][2]][keys[i][3]] = 1;
       }
   }


if (k<=j) ans = recurse(2);
else ans = recurse(1);

return;
}




int main(void)
{
int i, c;

//in = fopen("lab101.in", "rt"); out = fopen("lab101.out", "wt");
in = stdin; out = stdout;

init();
scan();
dwrk();
prnt();

fclose(in); fclose(out);

return 0;
}
