/*
TASK:lab101
LANG:C++
*/
#include <fstream>
#include <queue>
#include <iostream>

using namespace std;

//ifstream fin( "lab101.in" );

int n, m, p;
int a[ 16 ][ 16 ];
char F[ 11 ][ 11 ][ 11 ][ 11 ][ 1024 ][ 2 ]; //must be increased!!!!!
bool special[ 16 ][ 16 ];
int neix[ 16 ][ 16 ];
int neiy[ 16 ][ 16 ];
int p0=0;
int Kx[ 16 ];
int Ky[ 16 ];
int num[ 16 ][ 16 ];
int k=0;
int si1, sj1, si2, sj2;
int di, dj;
struct node
{ int i1, j1, i2, j2, p, turn; };
queue<node> q;

int mx[ 4 ] = { 1, -1, 0, 0 };
int my[ 4 ] = { 0, 0, -1, 1 };


void init( )
{	int i, j, p1;
	int seen[ 16 ][ 16 ];
	cin >> n >> m;
	for ( i=1; i<=n; i++ )
		for ( j=1; j<=m; j++)
		{	cin >> a[ i ][ j ]; seen[ i ][ j ]	= 0; }
	cin >> p;
		int x, y;
	
	for ( p1=1; p1<=p; p1++ )
	{	cin >> i >> j;
		cin >> y >> x;
		special[ i ][ j ] = true;
		neix[ i ][ j ] = x;
		neiy[ i ][ j ] = y;
		if ( !seen[ y ][ x ] )
		{ 	seen[ y ][ x ] = 1;
			Kx[ ++k ] = x;
			Ky[ k ] = y;
			num[ y ][ x ] = k;
		}
		
	}
	p0 = 0;
	for ( i=1; i<=k; i++ )
	{	p0 <<= 1;
		p0 += a[ Ky[ i ] ][ Kx[ i ] ];
	}
	cin >> si1 >> sj1 >> si2 >> sj2;
	cin >> di >> dj;
	//fin.close( );
}

bool ok( int i, int j, int p )
{ 	if ( !special[ i ][ j ] )
	{ if ( a[ i ][ j ] == 0 ) return true;
	 if ( a[ i ][ j ] == 1 ) return false;
	}
	return ( p & ( 1 << (num[ i ][ j ]-1 ) ) ) == 0;
}

void	solve( )
{ 	int y1, x1, p;
	node w;
	for ( y1=1; y1 <= n; y1++ )
		for ( x1=1; x1 <=m; x1++ )
			if ( y1 != di || x1 != dj )
			for ( p=0; p<=(1<<k)-1; p++ )
			{ 	F[ y1 ][ x1 ][ di ][ dj ][ p ][ 0 ] = 2;
				F[ di ][ dj ][ y1 ][ x1 ][ p ][ 1 ] = 1;
				w.i1 = y1;	w.j1 = x1; w.i2 = di;w.j2 = dj;	w.turn = 0; w.p = p;
				q.push( w );
				w.i1 = di;	w.j1 = dj; w.i2 = y1;w.j2 = x1;	w.turn = 1; w.p = p;
				q.push( w );
			}
	int i1, j1, i2, j2, turn;
	int m1;
	int ni, nj;
	while ( !q.empty( ) )
	{	w = q.front( ); q.pop( );
		i1 = w.i1; i2 = w.i2; j1 = w.j1; j2 = w.j2; turn = w.turn; p= w.p;
		if ( turn == 1 ) //second player in move
		{	//see for the first player prev moves
			if ( !ok( i2, j2, p ) ) continue;
			for ( m1=0; m1<4; m1++ )
			if ( i1 + my[ m1 ] <= n && i1 + my[ m1 ] > 0 )
				if ( j1 + mx[ m1 ] <= m && j1 + mx[ m1 ] > 0 )
				{
				 	ni = i1 + my[ m1 ];
					nj = j1 + mx[ m1 ];

					if ( ok( i1, j1, p )  )
					{	//we loose
						if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p ][ turn ] != turn+1 )
						{	if ( F[ ni ][ nj ][ i2 ][ j2 ][ p ][ 1-turn ] == 0 || F[ ni ][ nj ][ i2 ][ j2 ][ p ][ 1-turn ] == turn+1 )
							{
								F[ ni ][ nj ][ i2 ][ j2 ][ p ][ 1-turn ] = 2-turn;
								w.i1 = ni;	w.j1 = nj; w.i2 = i2;w.j2 = j2;	w.turn = 1-turn;
								w.p = p;
								q.push( w );
							}
						}
						else // this is winning for us
						{	if ( F[ ni ][ nj ][ i2 ][ j2 ][ p ][ 1-turn ] == 0 )
							{ 	if ( F[ ni ][ nj ][ i2 ][ j2 ][ p ][ 1-turn ] == 0 )
								{	F[ ni ][ nj ][ i2 ][ j2 ][ p ][ 1-turn ] = turn+1;
									w.i1 = ni;	w.j1 = nj; w.i2 = i2;w.j2 = j2;	w.turn = 1-turn;
									w.p = p;
									q.push( w );
								}
							}
						}
					}
				}
			if ( special[ i1 ][ j1 ] )
			{
				int x = neix[ i1 ][ j1 ];
				int y = neiy[ i1 ][ j1 ];
				if ( x != j2 || y != i2 )
				if ( x != j1 || y != i1 )
				{	int p1 = p;
					p1 ^= ( 1 << (num[ y ][ x ]-1 ) );
					if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p ][ turn ] != turn+1 )
						{	if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] == 0 || F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] == turn+1 )
							{	F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] = 2-turn;
								w.i1 = i1;	w.j1 = j1; w.i2 = i2;w.j2 = j2;	w.turn = 1-turn; w.p = p1;
								q.push( w );
							}
						}
						else // this is winning for us
						{	if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] == 0 )
							{		F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] = turn+1;
									w.i1 = ni;	w.j1 = nj; w.i2 = i2;w.j2 = j2;	w.turn = 1-turn;w.p = p1;
									q.push( w );
							}
						}
				}
			}
		}
		else
		{	if ( !ok( i1, j1, p ) ) continue;
			for ( m1=0; m1<4; m1++ )
			if ( i2 + my[ m1 ] <= n && i2 + my[ m1 ] > 0 )
				if ( j2 + mx[ m1 ] <= m && j2 + mx[ m1 ] > 0 )
				{
				 	ni = i2 + my[ m1 ];
					nj = j2 + mx[ m1 ];

					if ( ok( i2, j2, p )  )
					{	//we loose
						if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p ][ turn ] != turn+1 )
						{	if ( F[ i1 ][ j1 ][ ni ][ nj ][ p ][ 1-turn ] == 0 || F[ i1 ][ j1 ][ ni ][ nj ][ p ][ 1-turn ] == turn+1 )
							{
								F[ i1 ][ j1 ][ ni ][ nj ][ p ][ 1-turn ] = 2-turn;
								w.i1 = i1;	w.j1 = j1; w.i2 = ni;w.j2 = nj;	w.turn = 1-turn;
								w.p = p;
								q.push( w );
							}
						}
						else // this is winning for us
						{	if ( F[ i1 ][ j1 ][ ni ][ nj ][ p ][ 1-turn ] == 0 )
							{	F[ i1 ][ j1 ][ ni ][ nj ][ p ][ 1-turn ] = turn+1;
								w.i1 = i1;	w.j1 = j1; w.i2 = ni;w.j2 = nj;	w.turn = 1-turn;
								w.p = p;
								q.push( w );
							}
						}
					}
				}
			if ( special[ i2 ][ j2 ] )
			{	int x = neix[ i2 ][ j2 ];
				int y = neiy[ i2 ][ j2 ];
				if ( x != j2 || y != i2 )
				if ( x != j1 || y != i1 )
				{	int p1 = ( p ^ ( 1 << ( num[ y ][ x ] - 1 ) ) );
					if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p ][ turn ] != turn+1 )
						{	if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] == 0 || F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] == turn+1 )
							{	F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] = 2-turn;
								w.i1 = i1;	w.j1 = j1; w.i2 = i2;w.j2 = j2;	w.turn = 1-turn; w.p = p1;
								q.push( w );
							}
						}
						else // this is winning for us
						{	if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] == 0 )
							{ 	if ( F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] == 0 )
								{	F[ i1 ][ j1 ][ i2 ][ j2 ][ p1 ][ 1-turn ] = turn+1;
									w.i1 = ni;	w.j1 = nj; w.i2 = i2;w.j2 = j2;	w.turn = 1-turn;w.p = p1;
									q.push( w );
								}
							}
						}
				}
			}

		}
	}
	int ans = F[ si1 ][ sj1 ][ si2 ][ sj2 ][ p0 ][ 0 ];
	cout << ans << endl;
}

int main( )
{
	init( );
	solve( );
	
   return 0;
}
