#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 s = 1;	
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) && map[curnode.x][curnode.y] == map[qnode.x][qnode.y])
			{
				que.push(curnode);
				vis[curnode.x][curnode.y] = 1;
				flag[curnode.x][curnode.y] = s;
			}	
		}			
	}
}

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 node;
			
		for(int i = 0; i < x; ++ i)
		{
			for(int j = 0; j < y; ++ j)
			{
				if(!flag[i][j])
				{
					node.x = i;
					node.y = j;
					flag[i][j] = s;
					que.push(node);
					bfs();
					s ++;
				}
			}
		}

		printf("%d\n", traverse());
	}	
	
	return 0;
}