Problem: Pink Floyd are pulling a prank on Roger Waters. They know he doesn't like [walls](https://www.youtube.com/watch?v=YR5ApYxkU-U), he wants to be able to walk freely, so they are blocking him from exiting his room which can be seen as a grid.

Roger Waters has a square grid of size n× n and he wants to traverse his grid from the upper left (1,1) corner to the lower right corner (n,n). Waters can move from a square to any other square adjacent by a side, as long as he is still in the grid. Also except for the cells (1,1) and (n,n) every cell has a value 0 or 1 in it.

Before starting his traversal he will pick either a 0 or a 1 and will be able to only go to cells values in which are equal to the digit he chose. The starting and finishing cells (1,1) and (n,n) are exempt from this rule, he may go through them regardless of picked digit. Because of this the cell (1,1) takes value the letter 'S' and the cell (n,n) takes value the letter 'F'.

For example, in the first example test case, he can go from (1, 1) to (n, n) by using the zeroes on this path: (1, 1), (2, 1), (2, 2), (2, 3), (3, 3), (3, 4), (4, 4)

The rest of the band (Pink Floyd) wants Waters to not be able to do his traversal, so while he is not looking they will invert at most two cells in the grid (from 0 to 1 or vice versa). They are afraid they will not be quick enough and asked for your help in choosing the cells.  Note that you cannot invert cells (1, 1) and (n, n).

We can show that there always exists a solution for the given constraints.

Also note that Waters will pick his digit of the traversal after the band has changed his grid, so he must not be able to reach (n,n) no matter what digit he picks.

Input

Each test contains multiple test cases. The first line contains the number of test cases t (1 ≤ t ≤ 50). Description of the test cases follows.

The first line of each test case contains one integers n (3 ≤ n ≤ 200).

The following n lines of each test case contain the binary grid, square (1, 1) being colored in 'S' and square (n, n) being colored in 'F'.

The sum of values of n doesn't exceed 200.

Output

For each test case output on the first line an integer c (0 ≤ c ≤ 2) — the number of inverted cells.

In i-th of the following c lines, print the coordinates of the i-th cell you inverted. You may not invert the same cell twice.  Note that you cannot invert cells (1, 1) and (n, n).

Example

Input


3
4
S010
0001
1000
111F
3
S10
101
01F
5
S0101
00000
01111
11111
0001F


Output


1
3 4
2
1 2
2 1
0

Note

For the first test case, after inverting the cell, we get the following grid:
    
    
      
    S010  
    0001  
    1001  
    111F  
    

Solution (in JAVA):

Solution:
import java.util.*;

import javax.swing.plaf.basic.BasicScrollPaneUI.HSBChangeListener;

import java.io.*;

public class A {
	static BufferedReader br;
	static PrintWriter pw;
	static int inf = (int) 1e9;
	static long mod = (long) 1e9 + 7;

	static ArrayList<Integer>[] graph;
	static int n;
	static char[][] a;
	static boolean[][] vis;

	public static void main(String[] args) throws NumberFormatException, IOException, InterruptedException {
//		br = new BufferedReader(new FileReader(new File("chief.in")));
//		br = new BufferedReader(new InputStreamReader(System.in));
		Scanner sc = new Scanner(System.in);
		pw = new PrintWriter(System.out);
		int t = sc.nextInt();
		while (t-- > 0) {
			n = sc.nextInt();
			a = new char[n][n];
			for (int i = 0; i < a.length; i++) {
				a[i] = sc.nextLine().toCharArray();
			}
			int c = 0;
			ArrayList<pair> ans = new ArrayList<>();
			if (a[n - 1][n - 2] == '0') {
				ans.add(new pair(n, n - 1));
				c++;
			}
			if (a[n - 2][n - 1] == '0') {
				ans.add(new pair(n - 1, n));
				c++;
			}
			if (a[1][0] == '1') {
				ans.add(new pair(2, 1));
				c++;
			}
			if (a[0][1] == '1') {
				ans.add(new pair(1, 2));
				c++;
			}
			if(c<3) {
			pw.println(c);
			for (pair x : ans)
				pw.println(x.x + " " + x.y);
			}
			else {
				c=0;
				ans=new ArrayList<>();
				if (a[n - 1][n - 2] == '1') {
					ans.add(new pair(n, n - 1));
					c++;
				}
				if (a[n - 2][n - 1] == '1') {
					ans.add(new pair(n - 1, n));
					c++;
				}
				if (a[1][0] == '0') {
					ans.add(new pair(2, 1));
					c++;
				}
				if (a[0][1] == '0') {
					ans.add(new pair(1, 2));
					c++;
				}
				pw.println(c);
				for (pair x : ans)
					pw.println(x.x + " " + x.y);
			}
//			vis = new boolean[n][n];
//			boolean f = find('0', 0, 0);
//			vis = new boolean[n][n];
//			boolean g = find('1', 0, 0);
////			System.out.println(f+" "+g);
//			if (!f && !g)
//				c = 0;
//			else if (f && g) {
//				c = 2;
//				if (a[n - 1][n - 2] == '0') {
//					ans.add(new pair(n, n - 1));
//				}
//				if (a[n - 2][n - 1] == '0') {
//					ans.add(new pair(n - 1, n));
//				}
//				if (a[1][0] == '1') {
//					ans.add(new pair(2, 1));
//				}
//				if (a[0][1] == '1') {
//					ans.add(new pair(1, 2));
//				}
//			} else if (f) {
//				if (a[0][1] == '0' && a[1][0] == '0') {
//					if (a[n - 1][n - 2] == '0') {
//						c++;
//						ans.add(new pair(n, n - 1));
//					}
//					if (a[n - 2][n - 1] == '0') {
//						c++;
//						ans.add(new pair(n - 1, n));
//					}
//				} else {
//
//				}
//			} else {
//				if (a[0][1] == '1' && a[1][0] == '1') {
//					if (a[n - 1][n - 2] == '1') {
//						c++;
//						ans.add(new pair(n, n - 1));
//					}
//					if (a[n - 2][n - 1] == '1') {
//						c++;
//						ans.add(new pair(n - 1, n));
//					}
//				}
//			}
		}

		pw.flush();
		pw.close();

	}

	static boolean find(int s, int x, int y) {
		vis[x][y] = true;
		if (valid(x, y)) {
			if (x == n - 1 && y == n - 1)
				return true;
			boolean f = false;
			if (valid(x - 1, y) && !vis[x - 1][y] && (a[x - 1][y] == s || a[x - 1][y] == 'F'))
				f |= find(s, x - 1, y);
			if (valid(x + 1, y) && !vis[x + 1][y] && (a[x + 1][y] == s || a[x + 1][y] == 'F'))
				f |= find(s, x + 1, y);
			if (valid(x, y + 1) && !vis[x][y + 1] && (a[x][y + 1] == s || a[x][y + 1] == 'F'))
				f |= find(s, x, y + 1);
			if (valid(x, y - 1) && !vis[x][y - 1] && (a[x][y - 1] == s || a[x][y - 1] == 'F'))
				f |= find(s, x, y - 1);
			return f;
		}
		return false;
	}

	static boolean valid(int x, int y) {
		return x > -1 && x < n && y > -1 && y < n;
	}

	static long ans;
	static long[][] dp;
	static boolean[] color, down, total;

	static int dfs(int u, int pa) {
		int sum = down[u] ? 1 : 0;
		for (int v : graph[u]) {
			if (v == pa)
				continue;
			int s = dfs(v, u);
			ans += Math.min((2 * k - s), s);
			sum += s;
		}
		return sum;
	}

//	static int dfs2(int u, int pa, long l) {
//		int sum = 0;
//		for (pair v : graph[u]) {
//			if (v.x == pa)
//				continue;
//			if (l + v.y > down[v.x]) {
//				sum += total[v.x];
//			} else {
//				sum += dfs2(v.x, u, Math.max(0, l + v.y));
//			}
//		}
//		return sum;
//	}

//	static long[] f, g;
//
//	static void numOfSubtrees(int u, int pa) {
//		f[u] = 1;
//		for (int v : graph[u]) {
//			if (v == pa)
//				continue;
//			numOfSubtrees(v, u);
//			f[u] *= (1 + f[v]);
//			g[u] += f[v] + g[v];
//		}
//	}

	static ArrayList<Integer> primes; // generated by sieve

	/*
	 * 1. Generating a list of prime factors of N
	 */
	static ArrayList<Long> primeFactors(Long N) // O(sqrt(N) / ln sqrt(N))
	{
		ArrayList<Long> factors = new ArrayList<Long>(); // take abs(N) in case of -ve integers
		int idx = 0, p = primes.get(idx);

		while (p * p <= N) {
			if (N % p == 0)
				factors.add((long) p);
			while (N % p == 0) {
				N /= p;
			}
			if (idx + 1 == primes.size())
				break;
			p = primes.get(++idx);
		}

		if (N != 1) // last prime factor may be > sqrt(N)
			factors.add(N); // for integers whose largest prime factor has a power of 1
		return factors;
	}

	static int[] isComposite;

	static void sieve(int N) // O(N log log N)
	{
		isComposite = new int[N + 1];
		isComposite[0] = isComposite[1] = 1; // 0 indicates a prime number
		primes = new ArrayList<Integer>();

		for (int i = 2; i <= N; ++i) // can loop till i*i <= N if primes array is not needed O(N log log sqrt(N))
			if (isComposite[i] == 0) // can loop in 2 and odd integers for slightly better performance
			{
				primes.add(i);
				if (1l * i * i <= N)
					for (int j = i * i; j <= N; j += i) // j = i * 2 will not affect performance too much, may alter in
														// modified sieve
						isComposite[j] = 1;
			}
	}

	static class Scanner {
		StringTokenizer st;
		BufferedReader br;

		public Scanner(InputStream s) {
			br = new BufferedReader(new InputStreamReader(s));
		}

		public String next() throws IOException {
			while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public String nextLine() throws IOException {
			return br.readLine();
		}

		public boolean ready() throws IOException {
			return br.ready();
		}

	}

	static int m, k;

	static double[] memo;
	static ArrayList<Integer>[] adj;

	static long gcd(long a, long b) {
		if (a == 0)
			return b;
		return gcd(b % a, a);
	}

	// method to return LCM of two numbers
	static long lcm(long a, long b) {
		return (a * b) / gcd(a, b);
	}

	static double dis(int x, int y, int z, int w) {
		return Math.sqrt((x - z) * (x - z) + (y - w) * (y - w));
	}

	static int[] nxtarr() throws IOException {
		StringTokenizer st = new StringTokenizer(br.readLine());
		int[] a = new int[st.countTokens()];
		for (int i = 0; i < a.length; i++) {
			a[i] = Integer.parseInt(st.nextToken());
		}
		return a;
	}

	static long[] nxtarrLong() throws IOException {
		StringTokenizer st = new StringTokenizer(br.readLine());
		long[] a = new long[st.countTokens()];
		for (int i = 0; i < a.length; i++) {
			a[i] = Long.parseLong(st.nextToken());
		}
		return a;
	}

	static class pair implements Comparable<pair> {
		int x;
		int y;

		public pair(int d, int u) {
			x = d;
			y = u;
		}

		@Override
		public int compareTo(pair o) {
			// TODO Auto-generated method stub
			if (y == o.y)
				return x - o.x;
			return y - o.y;
		}

	}

	static class triple implements Comparable<triple> {
		int x;
		int y;
		int z;

		public triple(int a, int b, int c) {
			x = a;
			y = b;
			z = c;
		}

		@Override
		public int compareTo(triple o) {
			// TODO Auto-generated method stub
			return x - o.x;
		}
	}

}