import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.StringTokenizer; /** * * @author cteam012 */ public class tribune { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; /** * @param args the command line arguments */ public static void main(String[] args) throws IOException { String s; while ((s = br.readLine()) != null && !s.equals("")) { st = new StringTokenizer(s); int N = Integer.parseInt(st.nextToken()); char[][] table = new char[N][N]; HashMap counter = new HashMap<>(); for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); String line = st.nextToken(); for (int j = 0; j < N; j++) { char c = line.charAt(j); table[i][j] = c; if (counter.containsKey(c)) { int value = counter.get(c); counter.put(c, value + 1); } else { counter.put(c, 1); } } } int max = 0; char max_char = '_'; int min = 1000000; char min_char = '_'; boolean blocked = false; for (char c : counter.keySet()) { int value = counter.get(c); //System.out.println(c + ": " + value); if (value == 1) { max_char = c; blocked = true; } if (value < min && c != max_char) { min = value; min_char = c; } if (value > max && !blocked) { max = value; max_char = c; } } int I = 0; int J = 0; if (counter.get(max_char) == 1) { outer: for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { char c = table[i][j]; if (c == max_char) { I = i + 1; J = j + 1; break outer; } } } } else { for (int i = 0; i < N; i++) { int count = 0; for (int j = 0; j < N; j++) { char c = table[i][j]; if (c == max_char) { count++; } } if (count == 2){ I = i + 1; break; } } for (int j = 0; j < N; j++) { int count = 0; for (int i = 0; i < N; i++) { char c = table[i][j]; if (c == max_char) { count++; } } if (count == 2){ J = j+1; break; } } } System.out.println(I + " " + J + " " + min_char); } } private static boolean is_valid_(char max, char min, char[][] table, int i, int j) { ArrayList ids; for (int k = 0; k < table.length; k++) { int count = 0; ids = new ArrayList<>(); for (int l = 0; l < table.length; l++) { if (table[k][l] == max) { count++; ids.add(l); } } if (count >= 2) { for (int m = 0; m < count; m++) { int l = ids.get(m); for (int n = 0; n < table.length; n++) { if (table[n][l] == max) { return false; } } } } } return true; } private static boolean is_valid(char max, char min, char[][] table, int i, int j) { boolean seen_min = false; for (int k = 0; k < table.length; k++) { if (k != i) { char c = table[k][j]; if (c == min) { seen_min = true; } } } if (!seen_min) { return false; } seen_min = false; for (int k = 0; k < table.length; k++) { if (k != j) { char c = table[i][k]; if (c == min) { seen_min = true; } } } if (!seen_min) { return false; } return true; } }