/*
TASK: lab101
LANG: C
*/
#include<stdio.h>

#define MAXN 16
#define MAXV 16777216

int a[MAXN][MAXN],t[MAXN][MAXN],id[MAXN][MAXN],num[MAXN][2],q[MAXV],n,m;
int ans[4][2] = { {-1,0}, {1,0}, {0,1}, {0,-1} },pow2[MAXN];
char u[MAXV],c[MAXV];

int encode(int x1,int y1,int x2,int y2,int s)
{
	return (((x1*m+y1)*n+x2)*m+y2)*1024+s;
}

void decode(int code,int *x1,int *y1,int *x2,int *y2,int *s)
{
	*s=code%1024; code/=1024;
	*y2=code%m; code/=m;
	*x2=code%n; code/=n;
	*y1=code%m; code/=m;
	*x1=code;
}

int ON(int k,int i,int j)
{
	if(id[i][j]==-1) return a[i][j];
	else return ((k&pow2[id[i][j]])^a[i][j]);
}

int count(int x1,int y1,int x2,int y2,int s)
{
	int i,x,y,res=0;
	if(ON(s,x1,y1)||ON(s,x2,y2)) return 0;
	for(i=0;i<4;i++)
	{
		x=x1+ans[i][0];
		y=y1+ans[i][1];
		if(x<0||x>=n||y<0||y>=m||ON(s,x,y)) continue;
		res++;
	}
	if(t[x1][y1]!=-1)
	{
		x=num[t[x1][y1]][0];
		y=num[t[x1][y1]][1];
		if((x!=x1||y!=y1)&&(x!=x2||y!=y2)) res++;
	}
	return res;
}

int main()
{
	int i,j,k,k1,p,x1,y1,x2,y2,fx,fy,x,y,qb,qe,br=0,v1,v2,begin;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			scanf("%d",&a[i][j]);
			id[i][j]=-1;
			t[i][j]=-1;
		}
	}
	scanf("%d",&p);
	for(i=0;i<p;i++)
	{
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		if(id[x2-1][y2-1]==-1)
		{
			num[br][0]=x2-1; num[br][1]=y2-1;
			id[x2-1][y2-1]=br++;
		}
		t[x1-1][y1-1]=id[x2-1][y2-1];
	}
	scanf("%d%d",&x1,&y1);
	scanf("%d%d",&x2,&y2);
	scanf("%d%d",&fx,&fy);
	fx--; fy--;
	p=(1<<br);
	pow2[0]=1;
	for(i=1;i<=br;i++) pow2[i]=2*pow2[i-1];
	begin=encode(x1-1,y1-1,x2-1,y2-1,0);
	qb=qe=0;
	for(x1=0;x1<n;x1++)
	{
		for(y1=0;y1<m;y1++)
		{
			for(x2=0;x2<n;x2++)
			{
				for(y2=0;y2<m;y2++)
				{
					for(k=0;k<p;k++)
					{
						//if(x1==1&&y1==2&&x2==1&&y2==0&&k==1) printf("%d\n",count(x1,y1,x2,y2,k));
						c[encode(x1,y1,x2,y2,k)]=count(x1,y1,x2,y2,k);
					}
				}
			}
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			for(k=0;k<p;k++)
			{
				if(ON(k,fx,fy)||ON(k,i,j)) continue;
				v1=encode(i,j,fx,fy,k);
				q[qe++]=v1; u[v1]=2;
			}
		}
	}
	while(qb<qe)
	{
		v1=q[qb++];
		decode(v1,&x1,&y1,&x2,&y2,&k);
		for(i=0;i<4;i++)
		{
			x=x2+ans[i][0];
			y=y2+ans[i][1];
			if(x<0||x>=n||y<0||y>=m||ON(k,x,y)) continue;
			v2=encode(x,y,x1,y1,k);
			c[v2]--;
			if(u[v2]==0)
			{
				if(u[v1]==2) { u[v2]=1; q[qe++]=v2; }
				else if(c[v2]==0) { u[v2]=2; q[qe++]=v2; }
			}
		}
		if(t[x2][y2]!=-1)
		{
			x=num[t[x2][y2]][0];
			y=num[t[x2][y2]][1];
			if((x!=x1||y!=y1)&&(x!=x2||y!=y2))
			{
				k1=k^pow2[t[x2][y2]];
				v2=encode(x2,y2,x1,y1,k1);
				c[v2]--;
				if(u[v2]==0)
				{
					if(u[v1]==2) { u[v2]=1; q[qe++]=v2; }
					else if(c[v2]==0) { u[v2]=2; q[qe++]=v2; }
				}
			}
		}
	}
	printf("%d\n",u[begin]);
	return 0;
}
