#include <stdio.h>
#include <math.h>
#define Nmax 102
int A[Nmax][Nmax], viz[Nmax][Nmax], C[2][Nmax * Nmax], T[Nmax * Nmax], n, N, t, i, j, x, y, ok;
int dx[] = {0, 0, 1, -1}, dy[] = {-1, 1, 0, 0};
FILE *f = fopen("lacuri.in", "r");
FILE *g = fopen("lacuri.out", "w");
int fill(int i, int j) {
int k, x, y;
viz[i][j] = 1;
for (k = 0; k < 4; k++) {
x = i + dx[k];
y = j + dy[k];
if (A[x][y] && !viz[x][y] && x > 0 && x <= n && y > 0 && y <= n) {
t++;
fill(x, y);
}
}
}
int check(int t, int x, int y) {
int i, j; double k = sqrt(t);
if ((int) k != k)
return 0;
for (i = x; i < x + k; i++)
for (j = y; j < y + k; j++)
if (A[i][j] != 1)
return 0;
return 1;
}
void drum(int i) {
if (T[i]) {
drum(T[i]);
fprintf(g, "%d %d\n", C[0][i], C[1][i]);
}
else
fprintf(g, "1 1\n");
}
void lee() {
int p, u, k;
C[0][1] = 1, C[1][1] = 1, viz[1][1] = 1;
for (p = u = 1; p <= u; p++) {
i = C[0][p], j = C[1][p];
for (k = 0; k < 4; k++) {
x = i + dx[k];
y = j + dy[k];
if (!viz[x][y] && x > 0 && x <= n && y > 0 && y <= n) {
u++, C[0][u] = x, C[1][u] = y;
viz[x][y] = 1, T[u] = p;
if (x == n && y == n) {
drum(u);
return;
}
}
}
}
}
int main() {
fscanf(f, "%d", &n);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
fscanf(f, "%d", &A[i][j]);
for (i = 1, ok = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (A[i][j] == 1 && !viz[i][j]) {
t = 1; fill(i, j);
if (check(t, i, j))
N++;
else
ok = 0;
}
fprintf(g, "%d\n", N);
if (ok)
lee();
fclose(f); fclose(g);
return 0;
}