#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int n,m;
bool visited[N][N]; 
char a[N][N];
int mov[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};

int dfs(int i,int j,int &x,int &y,int &x2,int &y2){
    if(i<0||j<0||i>=n||j>=m||a[i][j]=='*') return 0; //非法
    if(visited[i][j]) return 0; // 之前走过了
    visited[i][j] = 1; // 记录
    int d = 1; // 深度遍历树的子树中所有节点的度
    // 更新坐标
    x = min(x,i),y = min(y,j),x2 = max(x2,i),y2 = max(y2,j);
    for(int k=0;k<4;k++){
        d += dfs(i+mov[k][0],j+mov[k][1],x,y,x2,y2);
    }
    return d;
}

int main() {
    cin >> n >> m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++) cin >> a[i][j];
    }
    int ans = 0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(visited[i][j]) continue;
            if(a[i][j]=='.'){
                // 记录左上角和右下角的顶点
                int x=i,y=j,x2=i,y2=j,k;
                k = dfs(i,j,x,y,x2,y2);
                // 判断是否为长方形
                if(k==(x2-x+1)*(y2-y+1)){ //两顶点内的格子数应该为k
                    ans++;
                }
            }
        }
    }
    cout << ans;
}