#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<sstream>
#include<set>
#include<map>
#include<cctype>
#include<vector>
#include<math.h>
#include<memory>
using namespace std;
char grid[101][101];
int visited[101][101];
int m, n;
int d1[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
int d[11][4] = { { 0, 0, 1, 1 }, { 1, 0, 0, 1 }, { 0, 1, 1, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 1 }, { 1, 0, 1, 0 },
{ 1, 0, 1, 1 }, { 0, 1, 1, 1 }, { 1, 1, 1, 0 }, { 1, 1, 0, 1 }, { 1, 1, 1, 1 } };
void dfs(int x, int y, int id)
{
visited[x][y] = 1;
int xx, yy, k;
for (int i = 0; i < 4; i++)
{
if (d[id][i])
{
xx = x + d1[i][0];
yy = y + d1[i][1];
k = grid[xx][yy] - 'A';
if (xx >= 0 && xx < m && yy >= 0 && yy < n
&& !visited[xx][yy] && d[k][(i + 2) % 4])//当前方格如果右边有接口,则判断右边的方格的左边的边是不是有接口
dfs(xx, yy, k);
}
}
}
int main()
{
int i, j,sum;
while (scanf("%d%d", &m, &n) != EOF && m != -1)
{
sum = 0;
memset(visited, 0, sizeof(visited));
for (i = 0; i < m; i++)
{
scanf("%s", grid[i]);
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (!visited[i][j])
{
dfs(i, j, grid[i][j] - 'A');
sum++;
}
}
}
printf("%d\n", sum);
}
return 0;
}