Problem: Problem statement

There is a town with a size of H in the north-south direction and W in the east-west direction. In the town, square plots with a side length of 1 are maintained without gaps, and one house is built in each plot.

A typhoon broke out over a section of the town, causing damage and then changing to an extratropical cyclone over a section. No damage is done after the change. As shown in the figure below, a typhoon is a square with a height of 3 and a width of 3, and the square with a star is called the center. The typhoon moves to the vicinity of 8 in units of sections. In other words, the center of the typhoon moves with the whole so that it moves to the section that shares the sides or vertices (including the current section). However, the typhoon does not protrude outside the town, and the center of the typhoon is the 0th and H-1st sections from the north and the 0th and W-1st sections from the west, as shown in the shaded area in the figure below. Move so that it does not pass.

<image>

Once a typhoon hits the sky, the degree of damage to the house changes as follows.

> No damage → Partially damaged → Half destroyed → Completely destroyed → No trace

Fortunately, however, there seems to be no house that has become a trace pear. Since the damage situation of each house is given, find the point where the typhoon occurred and the point where it changed to an extratropical cyclone. However, if the generated section is s_ith from the north, s_jth from the west, and the section changed to an extratropical cyclone is t_ith from the north and t_jth from the west, the two points are 10000 t_i + t_j ≤ 10000 s_i + s_j. Determined to meet.

input


H \ W
D_ {11} \… \ D_ {1W}
D_ {21} \… \ D_ {2W}
...
D_ {H1} \… \ D_ {HW}


D_ {ij} is an integer that expresses the degree of damage to the i-th house from the north and the j-th house from the west as follows.

* 0: No damage
* 1: Partially damaged
* 2: Half destroyed
* 3: Completely destroyed



Constraint

* An integer
* Input is given only if the answer is uniquely determined
* 3 ≤ H, W ≤ 500
* 0 ≤ D_ {ij} ≤ 3



output

Output the answer in one line as follows.


s_i \ s_j \ t_i \ t_j


sample

Sample input 1


7 5
0 0 0 0 0
0 1 1 1 0
0 2 2 2 0
0 3 3 3 0
0 2 2 2 0
0 1 1 1 0
0 0 0 0 0


Sample output 1


4 2 2 2


Sample input 2


6 6
0 0 0 1 1 1
0 0 0 2 2 2
0 0 1 3 3 2
1 2 3 3 2 1
1 2 3 2 1 0
1 2 2 1 0 0


Sample output 2


4 1 1 4


Sample input 3


4 4
2 2 2 0
2 2 2 0
2 2 2 0
0 0 0 0


Sample output 3


1 1 1 1






Example

Input

7 5
0 0 0 0 0
0 1 1 1 0
0 2 2 2 0
0 3 3 3 0
0 2 2 2 0
0 1 1 1 0
0 0 0 0 0


Output

4 2 2 2

Solution (in CPP):

Solution:
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

struct Info{
	Info(int arg_row,int arg_col){
		row = arg_row;
		col = arg_col;
	}
	int row,col;
};

int H,W;
int table[500][500],calc[500][500],adj_count[500][500];
int diff_row[8] = {-1,-1,-1,0,0,1,1,1},diff_col[8] = {-1,0,1,-1,1,-1,0,1};


bool rangeCheck(int row,int col){
	if(row >= 0 && row <= H-1 && col >= 0 && col <= W-1)return true;
	else{
		return false;
	}
}

int main(){

	scanf("%d %d",&H,&W);
	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++)scanf("%d",&table[row][col]);
	}

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			calc[row][col] = 0;
		}
	}

	int adj_sum,adj_row,adj_col;

	for(int row = 0; row <= H-2; row++){
		for(int col = 0; col <= W-2; col++){

			adj_sum = 0;
			for(int i = 0; i < 8; i++){
				adj_row = row+diff_row[i];
				adj_col = col+diff_col[i];
				if(rangeCheck(adj_row,adj_col) == false)continue;

				adj_sum += calc[adj_row][adj_col];
			}

			calc[row+1][col+1] = table[row][col]-(calc[row][col]+adj_sum);
		}
	}

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++)adj_count[row][col] = 0;
	}

	vector<Info> ANS;
	int count;

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			if(calc[row][col] == 0)continue;

			count = 0;
			for(int i = 0; i < 8; i++){
				adj_row = row+diff_row[i];
				adj_col = col+diff_col[i];

				if(rangeCheck(adj_row,adj_col) == false || calc[adj_row][adj_col] == 0)continue;

				count++;
				if(count >= 2)break;
			}
			if(count <= 1)ANS.push_back(Info(row,col));
		}
	}

	if(ANS.size() == 1){
		printf("%d %d %d %d\n",ANS[0].row,ANS[0].col,ANS[0].row,ANS[0].col);
		return 0;
	}

	if(10000*ANS[1].row+ANS[1].col > 10000*ANS[0].row+ANS[0].col)swap(ANS[0],ANS[1]);

	printf("%d %d %d %d\n",ANS[0].row,ANS[0].col,ANS[1].row,ANS[1].col);

	return 0;
}