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

#include <iostream>
#include <vector>
using namespace std;



int n,m;
bool a[8][16]; // 0 - prazni , 1 - pylno 
int p;
int kliuch[32][6]; // pechelivsh , kolko pyt ima do tam toq deto pecheli ot nego
int way[1024][2];
int pl[2][2];
int cc[2];


int pos[4][2] =
{
	{0,1},
	{1,0},
	{-1,0},
	{0,-1}
};

bool isValid(int x,int y)
{
	if ( x < 1 ) return false;
	if ( y < 1 ) return false;
	if ( x > n ) return false;
	if ( y > m ) return false;
	if ( a[x][y] == 1 ) return false;
	return true;
}

int bfs(int x,int y,int c[2])
{
	int used[8][16];
	for ( int i = 1 ; i <= n ; i++ )
		for ( int j = 1 ; j <= m ; j++ )
			used[i][j] = 0;
	
	int stack[64][2];
	stack[0][0] = x;
	stack[0][1] = y;
	used[x][y] = 1;
	int lev = 1;
	int p1 = 0;
	int p2 = 1;
	int sTop = 1;
	
	while ( p1 != p2 )
	{
		for ( int j = p1 ; j < p2 ; j++ )		
			for ( int i = 0 ; i < 4 ; i++ )
				if ( isValid(stack[j][0]+pos[i][0],stack[j][1]+pos[i][1]) )
					if ( !used[stack[j][0]+pos[i][0]][stack[j][1]+pos[i][1]] )
					{
//						printf("added %d %d\n",stack[j][0]+pos[i][0],stack[j][1]+pos[i][1]);
						stack[sTop][0] = stack[j][0]+pos[i][0];
						stack[sTop][1] = stack[j][1]+pos[i][1];
						used[stack[j][0]+pos[i][0]][stack[j][1]+pos[i][1]] = 1;
						if ( stack[sTop][0] == c[0] && stack[sTop][1] == c[1] ) return lev;
						sTop++;
					}
		p1 = p2;
		p2 = sTop;
		lev++;
	}
	
	return -1;
}
// na vseki hod mojem: da smenim poziciqta na kliuch ( ako ima takyv v tova pole )
//						da preminem v  drugo pole

void roll(int u) // nomera na kliucha
{
	a[kliuch[u][2]][kliuch[u][3]] +=1;
	a[kliuch[u][2]][kliuch[u][3]] %=2;
}
	
int main()
{
//	freopen("lab101.in","r",stdin);
//	freopen("lab102.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	for ( int i = 1 ; i <= n ; i++ )
		for ( int j = 1 ; j <= m ; j++ )
			scanf("%d",&a[i][j]);
			
	scanf("%d",&p);
	for ( int i = 0 ; i < p ; i++ )
		scanf("%d%d%d%d",&kliuch[i][0],&kliuch[i][1],&kliuch[i][2],&kliuch[i][3]);
	
	scanf("%d%d%d%d%d%d",&pl[0][0],&pl[0][1],&pl[1][0],&pl[1][1],&cc[0],&cc[1]);

	if ( !p ) 
	{
		int p1 = bfs(pl[0][0],pl[0][1],cc);
		int p2 = bfs(pl[1][0],pl[1][1],cc);
		
		if ( p1 <= p2 ) printf("1\n");
		else printf("2\n");
	}
		
	int w1 = bfs(pl[0][0],pl[0][1],cc);
	int w2 = bfs(pl[1][0],pl[1][1],cc);

	vector < pair<int,int> > ponomera;	
		
	for ( int i = 0 ; i < p ; i++ )
	{
		int c[2] = { kliuch[i][0],kliuch[i][1] };
		int p1 = bfs(pl[0][0],pl[0][1],c); // koi kolko byrzo stiga do kliucha
		int p2 = bfs(pl[1][0],pl[1][1],c);
			
		int klp[2] = { kliuch[i][2],kliuch[i][3] };
		int pk1 = bfs(pl[0][0],pl[0][1],klp);
		int pk2 = bfs(pl[1][0],pl[1][1],klp);
		roll(i); // veche sa pri kliucha i sq go vartime

		int pw1 = bfs(c[0],c[1],cc); // veche se pridvijvat kam celta
		int pw2 = bfs(c[0],c[1],cc); // koi li shte stigne pryv ? :D
		
		if ( p1 + pw1 < p2 + pw2 && p1 <= pk2  ) 
		{
			kliuch[i][4] = 1;
			kliuch[i][5] = p1;
			ponomera.push_back(pair<int,int>(i,p1));
		}
		else if (p1 + pw1 > p2 + pw2 && p2 < pk1 )
		{
			kliuch[i][4] = 2;
			kliuch[i][5] = p2;
			ponomera.push_back(pair<int,int>(i,p2));
		}
		
		roll(i);
		
//		printf("%d %d \n",kliuch[i][4],kliuch[i][5]);
	}
	for ( int i = 0 ; i < ponomera.size() ; i++ )
		for ( int j = i+1 ; j < ponomera.size() ; j++ )
			if ( ponomera[i].second	> ponomera[j].second ) 
			{
				pair<int,int> temp = ponomera[i];
				ponomera[i] = ponomera[j];
				ponomera[j] = temp;
			}
			/*
	for ( int i = 0 ; i < ponomera.size() ; i++ )
		printf("%d %d \n",ponomera[i].first,ponomera[i].second);
*/
	
	int cnt[2] = {0,0};
	for ( int i = 0 ; i < ponomera.size() ; i++ )
		cnt[kliuch[ponomera[i].first][4]-1]++;
	
	if ( cnt[0] > cnt[1] ) printf("1\n");
	else if ( cnt[0] == cnt[1] ) printf("0\n");
	else printf("2\n");
//	printf("%d\n",bfs(pl[0][0],pl[0][1]));
	
	return 0;
}
