/*
За първи път на международна олимпиада по информатика беше дадена задача, на
която точките на даден тест се оценяват според най-доброто решение, получено
от състезател. Освен това тази задача е Output only, т.е. по време на
състезанието са дадени тестовете и трябва да се изпратят само отговори, а не
сорс на решение.

Накратко перифразирано условие
Дадена е N*N таблица (в най-големия тест N<=2000). Във всяка клетка може да
има 0 или 1. Позволен е следния ход - в даден правоъгълен участък от матрицата
всички 0 да станат 1, а всички 1-ци да станат 0.

Ясно установено решение няма, но съществува такова, което може да се докаже,
че е най-много два пъти "по-лошо" от най-оптималното (авторите го наричат
2-оптимално). В зависимост от реализацията му, могат да се получат различни
точки, но ако имате вярно такова решение, поне половината точки са ГАРАНТИРАНИ
(в същност за дадените тестове - поне 75).

Кратко описание на решението

Ъглови точки ще наричаме тези точки, намиращи се между 4 клетки или по
контура, около които има нечетен брой клетки с 1-ца в тях. Неъглови са такива,
около които има четен брой клетки с 1-ца.

Пример: С $ са означени ъгловите точки

3
$--- ---$---
|   |   |   |
| 1 | 1 | 0 |
|   |   |   |
$---$--- ---
|   |   |   |
| 0 | 1 | 0 |
|   |   |   |
$--- --- ---$
|   |   |   |
| 1 | 0 | 1 |
|   |   |   |
$---$---$---$

Може да се докаже, че ако има ъглови точки, то поне три лежат на върховете на
правоъгълник (можем да забележим, че във всеки ред или стълб от точки, има
четен брой ъглови). Ако изберем този правоъгълник за ход, всички ъглови точки
във върховете му стават неъглови, а всички неъглови - ъглови. Ако всеки път
избираме такъв многоъгълник, ще намаляваме броя на ъгловите точки с поне 2.
Тъй като за един ход можем да елиминираме най-много 4 ъглови точки, а този
алгоритъм елиминира поне 2, казваме, че той е 2-оптимален, защото в най-лошия
случай (който, не може да се достигне) прави най-много 2 пъти повече от
възможно най-оптималния брой ходове.

В конкретната реализация, алгоритъма се стреми да намери правоъгълник с 4
ъглови точки и ако не може, избира за ход такъв само с 3.

Заб. Когато става дума за правоъгълник, се има в предвид такъв със страни,
успоредни на координатните оси.

Веселин Райчев
*/

#include <stdio.h>

int n,bad;
int inp[2048][2048];
int tra[2048][2048];

int __inline ptis(int y,int x)
{
  if ((x<0) || (y<0) || (x>=n) || (y>=n)) { return 0; }
  return inp[y][x];
}

int emit(int x1,int y1,int x2,int y2)
{
  tra[y1][x1]^=1;
  tra[y2][x1]^=1;
  tra[y1][x2]^=1;
  tra[y2][x2]^=1;
  printf("%d %d %d %d\n",x1+1,x2,y1+1,y2);
//  printf("%d %d %d %d\n",x1+1,y1+1,x2,y2);
  bad++;
}

int main(void)
{
  FILE* f;
  int i,j,r,a,l;
  f = fopen("xor.in","rt");
  fscanf(f,"%d ",&n);
  for (j=0;j<n;j++)
  {
    for (i=0;i<n;i++)
    {
      fscanf(f,"%d ",&inp[j][i]);
    }
  }
  fclose(f);

  for (j=0;j<=n;j++)
  {
    for (i=0;i<=n;i++)
    {
      tra[j][i] = (ptis(j-1,i-1)+ptis(j-1,i)+
                   ptis(j  ,i-1)+ptis(j  ,i))&1;
    }
  }

  printf("LEFT RIGHT TOP BOTTOM order\n");

  for (j=0;j<=n;j++)
  {
    a=0;
    for (i=0;i<=n;i++)
    {
      if (tra[j][i])
      {
        if (a)
        {
          for (r=j+1;r<=n;r++)
          {
            if ( (tra[r][l]) && (tra[r][i]) )
            {
              emit(l,j,i,r); a=0; break;
            }
          }
          if (a)
          {
            for (r=j+1;r<=n;r++)
            {
              if ( (tra[r][l]) || (tra[r][i]) )
              {
                emit(l,j,i,r); a=0; break;
              }
            }
          }
        } else { a=1; l=i; }
      }
    }
    if (a) { printf("Error in program :)\n"); break; }
  }

  printf("%d calls\n",bad);

  return 0;
}