#include <bits/stdc++.h>
using namespace std;

int n,m;
vector<vector<int>>a;
vector<vector<int>> ma;
vector<vector<pair<int,int>>> kov;
int bejar(int sor, int oszlop) {
    if (ma[sor][oszlop] != -1){
        return ma[sor][oszlop];
    }
    int sok = 1;                 
    kov[sor][oszlop] = {-1,-1};
    if (oszlop+1 < m &&abs(a[sor][oszlop+1]-a[sor][oszlop])<= 1) {
        int most = 1 + bejar(sor, oszlop+1);
        if (most > sok) {
            sok = most;
            kov[sor][oszlop] = {sor, oszlop+1};
        }
    }
    if (sor+1 < n &&abs(a[sor+1][oszlop] - a[sor][oszlop])<= 1) {

        int most = 1+bejar(sor+1, oszlop);
        if (most > sok) {
            sok = most;
            kov[sor][oszlop] = {sor+1, oszlop};
        }
    }
    ma[sor][oszlop] = sok;
    return sok;
}

int main() {
    cin >> n >> m;
    a.assign(n,vector<int>(m));
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
             cin >> a[i][j];
        }
    }

    ma.assign(n,vector<int>(m,-1));
    kov.assign(n,vector<pair<int,int>>(m, {-1,-1}));
    int ki = 0;
    pair<int,int>kezdes;
    for (int j = 0; j < m; j++) {
        int hossz = bejar(0,j);
        if (hossz > ki) {
            ki = hossz;
            kezdes = {0,j};
        }
    }
    vector<pair<int,int>>ut;
    pair<int,int>mo = kezdes;
    while (mo.first !=-1) {
        ut.push_back(mo);
        mo = kov[mo.first][mo.second];
    }
    auto kez = ut.front();
    auto veg = ut.back();
    cout << ki << "\n";
    cout << kez.first + 1 << " " << kez.second + 1 << " "<< veg.first + 1 << " " << veg.second + 1 << "\n";
}
