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

void hukasa(int,int,int);

int map[102][102];		//数値変換した果樹園のマップ
int ty[4] = {1,-1,0,0},tx[4] = {0,0,1,-1};	//四方向の移動量

int main()
{
	char in[101];			//入力文字列
	int y,x;				//果樹園の大きさh,w
	int i,j,r;				//ループ用変数
	int temp;				//作業用

	scanf("%d%d",&y,&x);
	
	while(y != 0 && x != 0){
		//初期化
		for(i = 0; i <= y+1; i++){
			map[0][i] = 0;
			map[x+1][i] = 0;
		}
		for(i = 0; i <= x+1; i++){
			map[i][0] = 0;
			map[i][y+1] = 0;
		}
		
		//入力
		for(j = 1; j <= y; j++){
			scanf("%s",in);
			//マップの数値化
			//しなくてもいいけど私はこうした方が分かり易いのでやる
			for(i = 1; i <= x; i++){
				if(in[i-1] == '#'){
					map[i][j] = -1;
				}
				else if(in[i-1] == '*'){
					map[i][j] = -2;
				}
				else if(in[i-1] == '@'){
					map[i][j] = -3;
				}
			}
		}
		
		//連続した部分の探索
		int c = 0;	//c:連続した区間の数
		for(j = 1; j <= y; j++){
			for(i = 1; i <= x; i++){
				if(map[i][j] < 0){
					//printf("現在地:%d,%d\n",i,j);
					c++;
					hukasa(i,j,map[i][j]);
				}
			}
		}
		
		/*デバッグ用出力:mapの出力
		for(i = 0; i <= y+1; i++){
			for(j = 0; j <= x+1; j++){
				printf("%2d",map[j][i]);
			}
			printf("\n");
		}*/

		printf("%d\n",c);


		scanf("%d%d",&y,&x);
	}

	return 0;
}

//深さ優先探索関数
//nx:現在地のx座標  ny:現在地のy座標  c:果実の種類
void hukasa(int nx,int ny,int c)
{
	int i,j;

	//現在地は探索済みなので
	//マップを壁に変えて重複して探索しないようにする
	map[nx][ny] = 0;

	//4方向を調べる
	for(i = 0; i < 4; i++){
		//もし果実の種類が同じなら移動
		if(map[nx + tx[i]][ny + ty[i]] == c){
			hukasa(nx + tx[i],ny + ty[i],c);
		}
	}

	return;
}