#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <assert.h>
#include <stdlib.h>
#include <time.h>

using namespace std;

long long a[2048][2048];
char x[2048][2048];

int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
char dir[] = "URDL";
int up[2048][2048], dwn[2048][2048], lft[2048][2048], rgt[2048][2048];
long long pxor[2048][2048], bigRandom[2048 * 2048];

long long getXor(int x0, int y0, int x1, int y1) {
    return pxor[x1][y1] ^ pxor[x0 - 1][y1] ^ pxor[x1][y0 - 1] ^ pxor[x0 - 1][y0 - 1];
}

int main() {
    //freopen("window.in", "r", stdin);
    //freopen("window.out", "w", stdout);

    srand(time(0));

    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j) {
            int tmp;
            scanf("%d", &tmp);
            a[i][j] = tmp;
        }

    for (int i = 1; i <= n * n / 2; ++i)
        bigRandom[i] = (long long) rand() * rand() * rand() * rand();
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j) {
            a[i][j] = bigRandom[a[i][j]];
            pxor[i][j] = pxor[i - 1][j] ^ pxor[i][j - 1] ^ pxor[i - 1][j - 1] ^ a[i][j];
        }

    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            for (int d = 0; d < 4; ++d) {
                int newi = i + dx[d];
                int newj = j + dy[d];
                if (a[newi][newj] == a[i][j]) {
                    x[i][j] = dir[d];
                    break;
                }
            }

   for (int i = 1; i <= n; ++i)
        for (int j = n; j >= 1; --j)
            if (x[i][j] == 'U')
                up[i][j] = 0;
            else
                up[i][j] = up[i][j + 1] + 1;
    for (int i = n; i >= 1; --i)
        for (int j = 1; j <= n; ++j)
            if (x[i][j] == 'L')
                lft[i][j] = 0;
            else
                lft[i][j] = 1 + lft[i + 1][j];
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            if (x[i][j] == 'D')
                dwn[i][j] = 0;
            else
                dwn[i][j] = 1 + dwn[i][j - 1];
    for (int j = 1; j <= n; ++j)
        for (int i = 1; i <= n; ++i)
            if (x[i][j] == 'R')
                rgt[i][j] = 0;
            else
                rgt[i][j] = 1 + rgt[i - 1][j];

    /*for (int i = 1; i <= n; ++i, printf("\n"))
        for (int j = 1; j <= n; ++j)
            printf("%d ", up[i][j]);

    printf("\n\n\n\n\n\n");


    for (int i = 1; i <= n; ++i, printf("\n"))
        for (int j = 1; j <= n; ++j)
            printf("%d ", dwn[i][j]);

    printf("\n\n\n\n\n\n");



    for (int i = 1; i <= n; ++i, printf("\n"))
        for (int j = 1; j <= n; ++j)
            printf("%d ", lft[i][j]);

    printf("\n\n\n\n\n\n");



    for (int i = 1; i <= n; ++i, printf("\n"))
        for (int j = 1; j <= n; ++j)
            printf("%d ", rgt[i][j]);

    printf("\n\n\n\n\n\n");
    */

    int res = 0, xx = 1, yy = 1;
    for (int i = 2; i < n; ++i)
        for (int j = 2; j < n; ++j) {
            int maxL = min(lft[i][j], up[i][j]);
            for (int k = 1; k < maxL; k += 2) {
                int curL = min(dwn[i + k][j + k], rgt[i + k][j + k]);
                if (i + k >= n || j + k >= n)
                    continue;
                if (curL >= k + 1 && getXor(i, j, i + k, j + k) == 0) {
                    int tmp = min(maxL, curL);
                    if (tmp > res) {
                        res = tmp;
                        xx = i;
                        yy = j;
                    }
                }
            }
        }

    printf("%d %d %d", res, xx, yy);
    return 0;
}
