import java.util.Scanner;
import java.util.LinkedList;

public class D_JJG
{
	public static void main(String args[])
	{
		new D_JJG();
	}

	public D_JJG()
	{
		Scanner in=new Scanner(System.in);

		int N;
		N=in.nextInt();

		for(int n=0; n<N; n++)
		{

			int rows;
			int cols;
			rows = in.nextInt();
			cols = in.nextInt();

			char[][] grid=new char[rows][cols];
			int[][] cost=new int[rows][cols];

			for(int r=0; r<rows; r++)
			{
				String line = in.next();
				for(int c=0; c<cols; c++)
				{
					cost[r][c]=1000000;
					grid[r][c]=line.charAt(c);

				}

			}
			System.out.println(search(grid,cost,rows,cols));

		}
		
	}

	private int search(char[][] grid, int[][] cost, int rows, int cols)
	{
		LinkedList<State> q=new LinkedList<State>();

		for(int c=0; c<cols; c++)
		{
			State s=new State(0,c,0,'.');
			q.add(s);
		}

		int min=1000000;

		while(q.size() > 0)
		{
			State s=q.poll();

			if (s.c<0) continue;
			if (s.c>=cols) continue;
			if (s.r<0) continue;
			if (s.r>=rows)
			{
				min = Math.min(min, s.cost);
				continue;
			}
			int my_cost=s.cost;
			
			if (grid[s.r][s.c]!= s.last)
			{
				my_cost++;
			}
			if (cost[s.r][s.c] <= my_cost)
			{
				continue;
			}
			cost[s.r][s.c] = my_cost;
			
			q.add(new State(s.r+1, s.c, my_cost, grid[s.r][s.c]));
			q.add(new State(s.r, s.c+1, my_cost, grid[s.r][s.c]));
			q.add(new State(s.r-1, s.c, my_cost, grid[s.r][s.c]));
			q.add(new State(s.r, s.c-1, my_cost, grid[s.r][s.c]));
			
		}
		return min;


	}

	public class State
	{
		int r;
		int c;
		int cost;
		char last;

		State(int r,int c,int cost, char last)
		{
			this.r=r;
			this.c=c;
			this.cost=cost;
			this.last=last;
			
		}

	}


}
