#include<iostream>
#include<fstream>
#include<cstdlib>
#include<iomanip>
#include<set>
#include<map>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>
#include<stack>
#include<cmath>
#define ll long long
#define pb push_back
#define ld long double
#define mp make_pair
#define pii pair<int, int>
using namespace std;

int maxk = 0, maxi, maxj;
int a[2000][2000];
int sumX[2000][2000];
int sumY[2000][2000];

int n;

bool good1(int x, int y, int k) {
    return (sumX[x + k][y] - sumX[x - 1][y] == 0) &&
           (sumY[x][y + k] - sumY[x][y - 1] == 0);
}

bool good2(int x, int y, int k) {
    return (sumX[x + k][y + k + 1] - sumX[x - 1][y + k + 1] == 0) &&
           (sumY[x + k + 1][y + k] - sumY[x + k + 1][y - 1] == 0);
}

int main(void) {
    scanf("%d", &n);
    int tm;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            scanf("%d", &tm);
            a[i][j] = tm;
        }
    }
    /*for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (used[a[i][j]]) {
                a[i][j] = -a[i][j];
            }
            else used[a[i][j]] = true;
        }
    }*/
    for (int i = 1; i < n; ++i) {
        sumY[i][0] = 0;
        sumX[0][i] = 0;
        for (int j = 1; j < n; ++j) {
            sumY[i][j] = sumY[i][j - 1];
            sumX[j][i] = sumX[j - 1][i];
            if (a[i - 1][j] == a[i][j]) {
                sumY[i][j]++;
            }
            if (a[j][i - 1] == a[j][i]) {
                sumX[j][i]++;
            }
        }
    }
    for (int i = 1; i < n - 1; ++i)
        for (int j = 1; j < n - 1; ++j) {
            for (int k = maxk + 1; k < n; ++k) {
                if ((i + k >= n - 1) || (j + k >= n - 1)) break;
                if (!good1(i, j, k)) break;
                if (good2(i, j, k)) {
                    maxk = k;
                    maxi = i;
                    maxj = j;
                }
            }
        }
    printf("%d %d %d\n", maxk + 1, maxi + 1, maxj + 1);
}
