#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

const int N = 2010;

int n, x[N][N], a[2 * N][2 * N], dist[2 * N][2 * N];
int val[2 * N][2 * N];
int rx = 1, ry = 1, rez = 1;

int aint[8 * N];

int poz, vall;

void update(int nod, int pozx, int pozy) {
    if(pozx == pozy) {
        aint[nod] = vall;
        return;
    }
    int mid = (pozx + pozy) / 2;
    
    if(mid >= poz)
        update(2 * nod, pozx, mid);
    else
        update(2 * nod + 1, mid + 1, pozy);
    
    aint[nod] = min(aint[2 * nod], aint[2 * nod + 1]);
}

int poz1, poz2;

int query(int nod, int pozx, int pozy) {
    if(aint[nod] > poz1)
        return 0;
    
    if(pozx == pozy)
        return pozx;
    
    int el, mid = (pozx + pozy) / 2;
    
    if(mid < poz2) {
        el = query(2 * nod + 1, mid + 1, pozy);
        if(el)
            return el;
    }
    if(mid >= poz1) {
        el = query(2 * nod, pozx, mid);
        if(el)
            return el;
    }
    return 0;
}

void calc(int pozx, int pozy, int nrel) {
    int i, elc = 1, x1[2 * N], x2[2 * N];
    
    for(i = 0; i <= 4 * nrel; ++i)
        aint[i] = 10 * N;
    
    for(i = 1; i < nrel; ++i) {
        
        x1[elc] = elc - dist[pozx][pozy] + 1; // distanta in sus
        if(dist[pozx][pozy] > rez) {
            poz = elc; vall = x1[elc];
            update(1, 1, nrel);
        }
        
        x2[elc] = val[pozx][pozy];
        
        ++pozx; ++pozy;
        ++elc;
    }
    x1[elc] = elc - dist[pozx][pozy] + 1; // distanta in sus
    
    if(dist[pozx][pozy] > rez) {
        poz = elc; vall = x1[elc];
        update(1, 1, nrel);
    }
    
    x2[elc] = val[pozx][pozy];
    
    for(i = 1; i < nrel; ++i) {
        --pozx; --pozy; --elc;
        
        poz1 = elc; poz2 = elc + x2[elc] - 1;
        
        if(poz2 - poz1 + 1 <= rez)
            continue;
        
        int rc = query(1, 1, nrel) - elc + 1;
        
        if(rc > rez) {
            rez = rc;
            rx = pozx;
            ry = pozy;
        }
    }
}

void sol() {
    int i, j;
    
    for(i = 1; i <= n; ++i)
        for(j = 1; j <= n; ++j) {
            if(a[i][j])
                a[i][j] = a[i - 1][j] + 1;
            
            dist[i][j] = a[i][j];
        }
    for(i = 1; i <= n; ++i)
        for(j = 1; j <= n; ++j) {
            if(a[i][j])
                a[i][j] = a[i][j - 1] + 1;
            
            dist[i][j] = min(dist[i][j], a[i][j]);
        }
    
    for(i = n; i; --i)
        for(j = n; j; --j) {
            if(a[i][j]) 
                a[i][j] = a[i + 1][j] + 1;
            
            val[i][j] = a[i][j];
        }
    for(i = n; i; --i)
        for(j = n; j; --j) {
            if(a[i][j]) 
                a[i][j] = a[i][j + 1] + 1;
            
            val[i][j] = min(val[i][j], a[i][j]);
        }
    
    calc(1, 1, n);
    for(i = 2; i < n; ++i) {
        calc(1, i, n - i + 1);
        calc(i, 1, n - i + 1);
    }
}

int main() {
    int i, j;
    //freopen("rrr", "r", stdin);
    
    cin >> n;
    
    for(i = 1; i <= n; ++i)
    for(j = 1; j <= n; ++j) {
        cin >> x[i][j];
    }
    
    for(i = 0; i < 2 * N; ++i)
        for(j = 0; j < 2 * N; ++j)
            a[i][j] = 1;
    
    for(i = 2; i < n; ++i)
        for(j = 2; j < n; ++j) {
            int cx = 2 * i - 2, cy = 2 * j - 2;
            a[cx][cy] = 0;
            
            if(x[i][j] == x[i - 1][j])
                a[cx - 1][cy] = 0;
            if(x[i][j] == x[i + 1][j])
                a[cx + 1][cy] = 0;
            if(x[i][j] == x[i][j - 1])
                a[cx][cy - 1] = 0;
            if(x[i][j] == x[i][j + 1])
                a[cx][cy + 1] = 0;
        }
    
    n = 2 * n - 3;
    
    //debug(a);
    
    sol();
    cout << rez / 2 << " " << rx / 2 + 2 << " " << ry / 2 + 2 << "\n";
    
    return 0;
}
