#include <stdio.h>

int n, m;
char maze[1005][1005];
// int vis[1005][1005];  //本次不使用标记数组,而是遇到'.'后把它入队,随即把此位置改成一个特殊字符'#'表示已访问过
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};

int num;

typedef struct node
{
    int x;
    int y;
} Node;

Node queue[1000000];


void bfs(int x, int y)
{
    
    int head = 0, tail = 0;
    int size = 1; //用来记录被剪下的区域的大小,即'.'的个数
    int maxx = x, maxy = y; //用来记录此区域的最大/最小x、y坐标值,即边界,
    int minx = x, miny = y; //计算面积area =(maxx-minx+1)*(maxy-miny+1),若area != size,说明此区域不是长方形

    //起点入队,入队从队尾入
    queue[tail].x = x;
    queue[tail].y = y;
    maze[x][y] = '#';    //做标记
    tail++;

    while (head < tail)
    {
        //出队,出队从队首出
        int x = queue[head].x;
        int y = queue[head].y;
        head++;

        for (int i = 0; i < 4; i++)
        {
            int nx = x + dir[i][0];
            int ny = y + dir[i][1];
            
            if (maze[nx][ny] == '.') //寻找到新的'.',入队
            {
                queue[tail].x = nx;
                queue[tail].y = ny;
                maze[nx][ny] = '#'; //做标记
                tail++;

                size++; //更新区域大小
                if (nx > maxx) //更新
                    maxx = nx;
                if (ny > maxy)
                    maxy = ny;
                if (nx < minx)
                    minx = nx;
                if (ny < miny)
                    miny = ny;
            }
        }
    }
    //搜索结束,进行判断
    if (size == (maxx-minx+1)*(maxy-miny+1))
    {
        num++;
    }
}   

int main() 
{
    num = 0; //初始化计数值
    scanf("%d %d\n", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%s", maze[i]);
    }

    // for (int i = 0; i < n; i++)
    // {
    //     printf("%s\n", maze[i]);

    // }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (maze[i][j] == '.')
            {
                bfs(i, j);
            }            
        }
    }


    printf("%d", num);

    return 0;
}