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

int n, m; // 地图的行数和列数
char a[100][100]; // 地图数据,使用char类型来存储'*'和'~'
int x, k; // x用于计数污染区域数量,k用于计数当前污染区域的面积
int fx[4] = {0, 1, 0, -1}, fy[4] = {1, 0, -1, 0}; // DFS的方向偏移量

// 深度优先搜索函数,用于标记和计算连通的污染区域面积
void dfs(int x, int y) {
    a[x][y] = '~'; // 标记当前位置为已访问
    k++; // 增加当前污染区域的面积计数
    for (int i = 0; i < 4; i++) { // 遍历四个方向
        int tx = x + fx[i];
        int ty = y + fy[i];
        // 检查新位置是否在地图范围内且为污染区域且未被访问过
        if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && a[tx][ty] == '*') {
            dfs(tx, ty); // 递归调用DFS
        }
    }
}

int main() {
    cin >> n >> m; // 输入地图尺寸
    for (int i = 1; i <= n; i++) { // 输入地图数据
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }
    int maxArea = 0, totalArea = 0; // 最大污染区域面积和总污染面积
    for (int i = 1; i <= n; i++) { // 遍历地图查找污染区域
        for (int j = 1; j <= m; j++) {
            if (a[i][j] == '*') {
                x++; // 增加污染区域计数
                k = 0; // 重置当前污染区域面积计数
                dfs(i, j); // 对当前污染区域执行DFS
                if (k > maxArea) maxArea = k; // 更新最大污染区域面积
                totalArea += k; // 累计总污染面积
            }
        }
    }
    cout << x << " " << totalArea << " " << maxArea << endl; // 输出结果
    return 0;
}
/**************************************************************
	Problem: 2112
	User: zengdongxin
	Language: C++
	Result: Time Limit Exceed
****************************************************************/