import java.io.*;
import java.util.*;

public class Reinier {
    public static void main(String[] args) throws IOException {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            new Reinier().run(reader);
        }
    }
	
	public int[][] A;
	public int[][][] D;
	public int m, n;

    public void run(BufferedReader reader) throws IOException {
		Scanner sc = new Scanner(reader);
		m = sc.nextInt();
		n = sc.nextInt();
		A = new int[m][n];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				A[i][j] = sc.nextInt();
			}
		}
		D = new int[m][n][m*n+1];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				for (int k = 0; k < m*n+1; k++) {
					D[i][j][k] = -2;
				}
			}
		}
		int ba = -1, bs = -1;
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				int s = 0;
				for (int t = 1; t <= m*n; t++) {
					int r = dfs(i, j, t);
					if (r >= 0 && s >= 0) {
						s = Math.max(s, r);
					} else {
						s = -1;
					}
				}
				if ((bs < 0 && s >= 0) || (s >= 0 && s < bs)) {
					bs = s;
					ba = A[i][j];
				}
			}
		}
		if (ba < 0) {
			System.out.println("impossible");
		} else {
			System.out.println(ba + " " + bs);
		}
    }

	int dfs(int i, int j, int t) {
		if (D[i][j][t] != -2) return D[i][j][t];
		D[i][j][t] = -1;
		if (A[i][j] == t) return D[i][j][t] = 0;

		int bi = 0, bj = 0, ba = -1000000000;
		int[] X = {i+1,i,i-1,i};
		int[] Y = {j,j+1,j,j-1};
		for (int k = 0; k < 4; k++) {
			if (X[k] >= 0 && X[k] < m && Y[k] >= 0 && Y[k] < n) {
				int a = A[X[k]][Y[k]];
				if (Math.abs(a-t) < Math.abs(ba-t) || (Math.abs(a-t) == Math.abs(ba-t) &&
						Math.abs(a-A[i][j]) < Math.abs(ba-A[i][j]))) {
					ba = a;
					bi = X[k];
					bj = Y[k];
				}
			}
		}
		int r = dfs(bi, bj, t)+1;
		if (r == 0) r = -1;
		D[i][j][t] = r;
		return r;
	}
}
