using System;
using System.Collections.Generic;

namespace AOJ.Volume2
{
    public class Block
    {
        private class Point
        {
            public int X { get; set; }
            public int Y { get; set; }
        }

        public static int Main()
        {
            while (true)
            {
                var input = Console.ReadLine().Split(' ');
                int w = int.Parse(input[0]);
                int h = int.Parse(input[1]);
                if (w == 0 && h == 0) { break; }

                // ?????????????????´?????????????????????
                input = Console.ReadLine().Split(' ');
                int start_x = int.Parse(input[0]);
                int start_y = int.Parse(input[1]);
                input = Console.ReadLine().Split(' ');
                int goal_x = int.Parse(input[0]);
                int goal_y = int.Parse(input[1]);

                // ?????????????????±
                int n = int.Parse(Console.ReadLine());
                // ????????????????????¨???????????????
                int[,] map = new int[h + 2, w + 2];
                for(int i = 1; i <= n; i++)
                {
                    input = Console.ReadLine().Split(' ');
                    int color = int.Parse(input[0]);
                    bool vertical = input[1] == "1" ? true : false;
                    int x = int.Parse(input[2]);
                    int y = int.Parse(input[3]);
                    // ???????????????
                    int loop_x, loop_y;
                    if (vertical)
                    {
                        loop_x = 2;
                        loop_y = 4;
                    }
                    else
                    {
                        loop_x = 4;
                        loop_y = 2;
                    }

                    for(int j = 0; j < loop_y; j++)
                    {
                        for(int k = 0; k < loop_x; k++) { map[y + j, x + k] = color; }
                    }
                }

                // ????????????
                // ???????????????????????´?????????0(?????????)???NG
                if (map[start_y, start_x] == 0 || map[goal_y, goal_x] == 0)
                {
                    Console.WriteLine("NG");
                    continue;
                }
                // ??????????????¨??´????????????????????????NG
                if (map[start_y, start_x] != map[goal_y, goal_x])
                {
                    Console.WriteLine("NG");
                    continue;
                }

                // ??±???????????¢?´¢??§??´???????????¢???
                int start_color = map[start_y, start_x];
                var p = new Point() { X = start_x, Y = start_y };
                var st = new Stack<Point>();
                st.Push(p);
                bool success = false;
                while (st.Count > 0)
                {
                    p = st.Pop();
                    if ((p.X == goal_x) && (p.Y == goal_y))
                    {
                        success = true;
                        break;
                    }
                    // ?¨????????????§????????????????????????
                    map[p.Y, p.X] = 0;

                    // ????????????????????????????????¢???
                    if (map[p.Y - 1, p.X] == start_color) { st.Push(new Point() { X = p.X, Y = p.Y - 1 }); }
                    if (map[p.Y + 1, p.X] == start_color) { st.Push(new Point() { X = p.X, Y = p.Y + 1 }); }
                    if (map[p.Y, p.X - 1] == start_color) { st.Push(new Point() { X = p.X - 1, Y = p.Y }); }
                    if (map[p.Y, p.X + 1] == start_color) { st.Push(new Point() { X = p.X + 1, Y = p.Y }); }
                }
                if (success) { Console.WriteLine("OK"); }
                else { Console.WriteLine("NG"); }
            }
            return 0;
        }
    }
}

Measured memory_bytes: 9896