#include <stdio.h>
#include <math.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;

const int maxn = 101;
typedef struct posn_t
{
	int x;
	int y;	
}posn;

int x, y;
int vis[maxn][maxn];
int flag[maxn][maxn];
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
char map[maxn][maxn];
queue<posn> que;

bool bounds(posn test)
{
	if(test.x < x && test.y < y && test.x >= 0 && test.y >= 0
		&& !vis[test.x][test.y])
	{
		return true;	
	}
	else
	{
		return false;
	}
	
}

void bfs()
{
	posn curnode, qnode;
	while(!que.empty())
	{
		qnode  = que.front();
		que.pop();
	
		for(int i = 0; i < 4; ++ i)
		{
			curnode.x = qnode.x + dir[i][0];
			curnode.y = qnode.y + dir[i][1];

			if(bounds(curnode))
			{
				que.push(curnode);
				vis[curnode.x][curnode.y] = 1;
				
				if(map[curnode.x][curnode.y] == map[qnode.x][qnode.y])
				{
					flag[curnode.x][curnode.y] = flag[qnode.x][qnode.y];	
				}	
				else
				{
					flag[curnode.x][curnode.y] = flag[qnode.x][qnode.y] + 1;					
				}	
			}
			
		}			
	}
}

int traverse()
{
	int ret = 0;
	for(int i = 0;i < x; ++ i)
	{
		for(int j = 0; j < y; ++ j)
		{
			ret = max(ret, flag[i][j]);	
		}
	}	
	
	return ret;
}

int main()
{
	while(~scanf("%d%d%*c", &x, &y) && x && y)
	{
		for(int i = 0; i < x; ++ i)
		{
			fgets(map[i], sizeof(map[i]), stdin);
		//	gets(map[i]);	
		}
		
		memset(flag, 0, sizeof(flag));
		memset(vis, 0, sizeof(vis));
		
		posn fistnode;
		fistnode.x = 0;
		fistnode.y = 0;
		flag[0][0] = 1;
		vis[0][0] = 1;
		que.push(fistnode);
		
		bfs();
#ifdef TEST		
		for(int i = 0; i < x; ++ i)
		{
			for(int j = 0; j < y; ++ j)
			{
				printf("%5d ", flag[i][j]);
			}
			printf("\n");
		}
#endif
		printf("%d\n", traverse());
		
		while(!que.empty())
		{
			que.pop();
		}
	}	
	
	return 0;
}