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


#define rep(i,n) for(short i = 0; i < n; i++)
#define MAX 50

int dx[] = {0,0,-1,1},
	dy[] = {1,-1,0,0};

typedef pair<short,short> P;
P S,G;
short w,h;

short color;
	queue<P> que;
	
bool check(short maze[MAX][MAX])
{
	que.push(S);

	color = maze[S.second][S.first];
	if(color < 0)
		return false;

	short nx,ny;
	while(que.size()){
		P p = que.front();	que.pop();

		if(p == G){
			while(que.size())
				que.pop();
			return true;
		}

		rep(i,4){
			nx = p.first + dx[i], ny = p.second + dy[i];
			
			if(nx > -1 && ny > -1 && nx < w && ny < h &&
				maze[ny][nx] == color){
					maze[ny][nx] = -1;
					que.push(P(nx,ny));
			}

		}
	}


	
	return false;
}

int main(void)
{
	short n,c,d,x,y;
	short maze[MAX][MAX];
	while(cin >> w >> h, w){
	/*	rep(i,MAX){
			rep(j,MAX)
				maze[i][j] = -10;
		}*/
		cin >> S.first >> S.second;
		cin >> G.first >> G.second;
		S.first = S.first / 2;
		S.second= S.second/ 2;

		cin >> n;

		rep(i,n){
			cin >> c >> d >> x >> y;
			x /= 2;
			y /= 2;
			x++;
			y++;

			if(d == 0)
				maze[y][x] = maze[y][x+1] = c;
			else
				maze[y][x] = maze[y+1][x] = c;
		}
		
		if(/*maze[S.second][S.first] > 0 && */maze[S.second][S.first] == maze[G.second][G.first] && check(maze))
			cout << "OK\n";
		else
			cout << "NG\n";

	}
	
	return 0;
}