public class Main implements java.lang.Runnable { static MyPrintWriter pw = MyPrintWriter.getInstance(); static FastScanner sc = FastScanner.getInstance(); public static void main(java.lang.String[] args) throws java.io.IOException { new Main().run(); Main.pw.flush(); // JavaToCpp.export(); } int N; int[][] d; int K; @java.lang.Override public void run() { N = Main.sc.nextInt(); K = Main.sc.nextInt(); char[][] cs = Main.sc.nextChars(N, N); d = new int[N][N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { d[i][j] = cs[i][j] - '0'; } } java.util.ArrayList list = new java.util.ArrayList<>(); for (int i = 0; i < N; i++) { if (d[i][N / 2] != 0) { list.add(new IntPoint(i, N / 2)); d[i][N / 2] = 0; } } for (int i = 0; i < N; i++) { if (d[N / 2][i] != 0) { list.add(new IntPoint(N / 2, i)); d[N / 2][i] = 0; } } Main.pw.println(list.size()); for (int i = 0; i < list.size(); i++) { var p = list.get(i); Main.pw.println((p.x() + " ") + p.y()); } Main.pw.flush(); } void tr(java.lang.Object... objects) { java.lang.System.out.println(java.util.Arrays.deepToString(objects)); } } class FastScanner { private static FastScanner instance = null; private final java.io.InputStream in = java.lang.System.in; private final byte[] buffer = new byte[1 << 16]; private int ptr = 0; private int buflen = 0; private FastScanner() { } public static FastScanner getInstance() { if (FastScanner.instance == null) { FastScanner.instance = new FastScanner(); } return FastScanner.instance; } private boolean hasNextByte() { if (ptr < buflen) { return true; } ptr = 0; try { buflen = in.read(buffer); } catch (java.io.IOException e) { e.printStackTrace(); } return buflen > 0; } private int readByte() { if (hasNextByte()) { return buffer[ptr++]; } else { return -1; } } private boolean isPrintableChar(int c) { return (33 <= c) && (c <= 126); } public boolean hasNext() { while (hasNextByte() && (!isPrintableChar(buffer[ptr]))) { ptr++; } return hasNextByte(); } public java.lang.String next() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } java.lang.StringBuilder sb = new java.lang.StringBuilder(); int b = readByte(); while (isPrintableChar(b)) { sb.appendCodePoint(b); b = readByte(); } return sb.toString(); } public long nextLong() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } long n = 0; boolean minus = false; int b = readByte(); if (b == '-') { minus = true; b = readByte(); } while ((b >= '0') && (b <= '9')) { // n = n * 10 + (b - '0'); n = ((n << 1) + (n << 3)) + (b - '0'); b = readByte(); } return minus ? -n : n; } public int nextInt() { return ((int) (nextLong())); } public char[][] nextChars(int H, int W) { if (W == 0) { return new char[H][0]; } char[][] a = new char[H][]; for (int i = 0; i < H; i++) { a[i] = next().toCharArray(); } return a; } } class IntPoint { int x; int y; public IntPoint(int x, int y) { this.x = x; this.y = y; } public int x() { return x; } public int y() { return y; } /** * この点と別のオブジェクトの同値性を判定します。 * *

計算量: O(1)

* * @param obj * 比較対象のオブジェクト * @return 同値であれば true, そうでなければ false */ // 未テスト @java.lang.Override public boolean equals(java.lang.Object obj) { if (this == obj) { return true; } if (!(obj instanceof IntPoint)) { return false; } IntPoint other = ((IntPoint) (obj)); return (x == other.x) && (y == other.y); } /** * この点のハッシュコードを計算します。 * *

計算量: O(1)

* * @return ハッシュコード */ // 未テスト @java.lang.Override public int hashCode() { return java.util.Objects.hash(x, y); } @java.lang.Override public java.lang.String toString() { return ((("(" + x) + ",") + y) + ")"; } } class MyPrintWriter extends java.io.PrintWriter { private static MyPrintWriter instance = null; private MyPrintWriter() { super(java.lang.System.out); } public static MyPrintWriter getInstance() { if (MyPrintWriter.instance == null) { MyPrintWriter.instance = new MyPrintWriter(); } return MyPrintWriter.instance; } public MyPrintWriter(java.io.PrintStream out) { super(out); } } // --- Original Code --- // import java.io.IOException; // import java.util.ArrayList; // import java.util.Arrays; // import java.util.Random; // // import library.tools.FastScanner; // import library.tools.JavaToCpp; // import library.tools.MergeFiles; // import library.tools.MyPrintWriter; // import library.util.Fp; // import library.util.geometry.IntPoint; // import library.util.polynomial.PolynomialFpDynamic; // // public class Main implements Runnable { // // static MyPrintWriter pw=MyPrintWriter.getInstance(); // static FastScanner sc=FastScanner.getInstance(); // // public static void main(String[] args) throws IOException { // new Main().run(); // pw.flush(); // MergeFiles.export(); // // JavaToCpp.export(); // } // // Random r=new Random(); // // int N; // int[][]d; // int K; // // @java.lang.Override // public void run() { // N=sc.nextInt(); // K=sc.nextInt(); // char[][]cs=sc.nextChars(N, N); // d=new int[N][N]; // for (int i = 0; i < N; i++) { // for (int j = 0; j < N; j++) { // d[i][j]=cs[i][j]-'0'; // } // } // ArrayList list=new ArrayList<>(); // tr("!"); // for (int i = 0; i < N; i++) { // if(d[i][N/2]!=0) { // list.add(new IntPoint(i, N/2)); // d[i][N/2]=0; // } // } // for (int i = 0; i < N; i++) { // if(d[N/2][i]!=0) { // list.add(new IntPoint(N/2, i)); // d[N/2][i]=0; // } // } // pw.println(list.size()); // for (int i = 0; i < list.size(); i++) { // var p=list.get(i); // pw.println(p.x()+" "+p.y()); // } // pw.flush(); // } // // // int id(int i, int j) { // return N*i+j; // } // // // void tr(Object...objects) {System.out.println(Arrays.deepToString(objects));} // // // } //