/* I used this question to search for it. I originally wanted to use and query the set. However, WA can't directly search for it.

*/

# Include <cstdio>

# Include <cstring>

Int n, m;

Int dx [] = {0, 0, 1,-1}, dy [] = {1,-1, 0}; // r l d u

Char s [2, 555] [555]

Int p [555], vis [555] [555];

Struct Node

{

Int u, d, l, r;

} Map [2, 555] [2, 555];

Int build (int x, int y)

{

If (s [x] [y] = 'A ')

{

Map [x] [y]. u = 1;

Map [x] [y]. d = 0;

Map [x] [y]. l = 1;

Map [x] [y]. r = 0;

}

Else if (s [x] [y] = 'B ')

{

Map [x] [y]. u = 1;

Map [x] [y]. d = 0;

Map [x] [y]. l = 0;

Map [x] [y]. r = 1;

}

Else if (s [x] [y] = 'C ')

{

Map [x] [y]. u = 0;

Map [x] [y]. d = 1;

Map [x] [y]. l = 1;

Map [x] [y]. r = 0;

}

Else if (s [x] [y] = 'D ')

{

Map [x] [y]. u = 0;

Map [x] [y]. d = 1;

Map [x] [y]. l = 0;

Map [x] [y]. r = 1;

}

Else if (s [x] [y] = 'E ')

{

Map [x] [y]. u = 1;

Map [x] [y]. d = 1;

Map [x] [y]. l = 0;

Map [x] [y]. r = 0;

}

Else if (s [x] [y] = 'F ')

{

Map [x] [y]. u = 0;

Map [x] [y]. d = 0;

Map [x] [y]. l = 1;

Map [x] [y]. r = 1;

}

Else if (s [x] [y] = 'G ')

{

Map [x] [y]. u = 1;

Map [x] [y]. d = 0;

Map [x] [y]. l = 1;

Map [x] [y]. r = 1;

}

Else if (s [x] [y] = 'H ')

{

Map [x] [y]. u = 1;

Map [x] [y]. d = 1;

Map [x] [y]. l = 1;

Map [x] [y]. r = 0;

}

Else if (s [x] [y] = 'I ')

{

Map [x] [y]. u = 0;

Map [x] [y]. d = 1;

Map [x] [y]. l = 1;

Map [x] [y]. r = 1;

}

Else if (s [x] [y] = 'J ')

{

Map [x] [y]. u = 1;

Map [x] [y]. d = 1;

Map [x] [y]. l = 0;

Map [x] [y]. r = 1;

}

Else if (s [x] [y] = 'k ')

{

Map [x] [y]. u = 1;

Map [x] [y]. d = 1;

Map [x] [y]. l = 1;

Map [x] [y]. r = 1;

}

}

Int insert (int nx, int ny, int x, int y, int d)

{

If (d = 0)

{

If (map [x] [y]. r & map [nx] [ny]. l)

Return 1;

}

Else if (d = 1)

{

If (map [x] [y]. l & map [nx] [ny]. r)

Return 1;

}

Else if (d = 2)

{

If (map [x] [y]. d & map [nx] [ny]. u)

Return 1;

}

Else if (d = 3)

{

If (map [x] [y]. u & map [nx] [ny]. d)

Return 1;

}

Return 0;

}

Int find (int x)

{

Return x = p [x]? X: p [x] = find (p [x]);

}

Int Union (int x, int y)

{

Int nx = find (x );

Int ny = find (y );

If (nx! = Ny)

P [ny] = nx;

}

Int dfs (int x, int y)

{

For (int I = 0; I <4; I ++)

{

Int nx = dx [I] + x;

Int ny = dy [I] + y;

If (nx> = 0 & nx <n & ny> = 0 & ny <m)

If (! Vis [nx] [ny] & insert (nx, ny, x, y, I ))

{

Vis [nx] [ny] = 1;

Union (x * m + y, nx * m + ny );

Dfs (nx, ny );

}

}

}

Int solve ()

{

Int ans = 0;

Memset (vis, 0, sizeof (vis ));

For (int I = 0; I <n; I ++)

For (int j = 0; j <m; j ++)

If (! Vis [I] [j])

{

Vis [I] [j] = 1;

Ans ++;

Dfs (I, j );

}

/* For (int I = 0; I <n * m; I ++)

If (p [I] = I)

Ans ++ ;*/

Printf ("% d \ n", ans );

}

Int main ()

{

While (scanf ("% d", & n, & m) = 2)

{

If (n <0 | m <0) break;

Memset (map, 0, sizeof (map ));

For (int I = 0; I <n * m; I ++)

P [I] = I;

For (int I = 0; I <n; I ++)

{

Scanf ("% s", s [I]);

For (int j = 0; j <m; j ++)

Build (I, j );

}

Solve ();

}

Return 0;

}