#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef struct node{
int x,y;
node(int x,int y):x(x),y(y){}
}Node;
int n,m,map[505][505];
vector<node>v;
//添加上下左右左上左下右上右下八个点
void init(){
v.push_back(node(-1,0));
v.push_back(node(1,0));
v.push_back(node(0,-1));
v.push_back(node(0,1));
v.push_back(node(-1,-1));
v.push_back(node(-1,1));
v.push_back(node(1,-1));
v.push_back(node(1,1));
}
//下一个相邻的点是否是水坑
bool judge(int x,int y){
if(x < 0||x >= n){
return false;
}
if(y < 0||y >= m){
return false;
}
if(map[x][y] == 0){
return false;
}
return true;
}
int main(){
init();
cin>>n>>m;
string s;
for(int i = 0;i < n;i++){
cin>>s;
for(int j = 0;j < m;j++){
if(s[j] == '.'){
map[i][j] = 0;//用0当做干地
}else{
map[i][j] = 1;//用0当做积水
}
}
}
int cnt = 0;
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
if(map[i][j]){
map[i][j] = 0;//标记该点已经遍历过
queue<node>q;
//添加周围八个点
for(int k = 0;k < 8;k++){
if(judge(i+v[k].x,j+v[k].y)){
q.push(node(i+v[k].x,j+v[k].y));
map[i+v[k].x][j+v[k].y] = 0;//标记该点已经遍历过
}
}
//这里题目意思有些模糊,没有明确说明水坑是否至少由两个积水形成
//这里直接将两个及两个以上积水也看做水坑
if(q.size() > 0){
cnt++;
}
while(!q.empty()){
Node head = q.front();
q.pop();
for(int k = 0;k < 8;k++){
if(judge(head.x+v[k].x,head.y+v[k].y)){
q.push(node(head.x+v[k].x,head.y+v[k].y));
map[head.x+v[k].x][head.y+v[k].y] = 0;
}
}
}
}
}
}
cout<<cnt<<endl;
return 0;
}