/*基本思路是通过外层两个遍历遍历矩阵,并设置res初值为0,对每一个外层遍历水坑,这里体现为值为0,将其置为2并使res++,同时调用DFS函数将其周围8联通的格子置为2并对8联通的格子递归执行dfs,当外层遍历结束时res值即为答案
*/
#include <iostream>
#include <vector>
using namespace std;

//深度优先搜索函数
void dfs(int i, int j, vector<vector<int>>& grid){
    int n = grid.size();
    int m = grid[0].size();
    for(int a = i - 1; a <= i + 1; a++){
        for(int b = j - 1; b <= j + 1; b++){
            if(a >= 0 && a < n && b >= 0 && b < m && !(a == i && b == j)){
                if(grid[a][b] == 0){
                    grid[a][b] = 2;
                    dfs(a, b, grid);
                }
            }
        }
    }
}

int main() {
    //输入数据
    int n, m;
    cin >> n >> m;
    vector<vector<int>> grid(n,vector<int>(m,0));
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            char c;
            cin >> c;
            if(c == 'W'){
                grid[i][j] = 0;
            }
            else{
                grid[i][j] = 1;
            }
        }
    }
    int res = 0;//res存储结果

    //外层循环
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(grid[i][j] == 0){
               res++;
               grid[i][j] = 2;
               dfs(i, j, grid);
            }
        }
    }
    cout << res << endl;//输出结果
    return 0;
}
// 64 位输出请用 printf("%lld")