#Description
经典floodfill
#Algorithm
flood fill
#Hint
记得判断边界
#Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;
int m, n;
const int maxm = 100 + 9;
const int maxn = 100 + 9;
const int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
const int dy[8] = {1, -1,0, 1, -1, 0, 1, -1 };
bool g[maxm][maxn];
struct V
{
int x, y;
V(int x, int y) : x(x), y(y) {}
};
void print()
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
if (g[i][j]) cout << '@'; else cout << '*';
cout << endl;
}
cout << endl;
}
void solve()
{
memset(g, 0, sizeof(g));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
char ch;
cin >> ch;
if (ch == '@') g[i][j] = true;
}
scanf("\n");
}
int ans = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (g[i][j])
{
stack<V> s;
s.push(V(i, j));
while (!s.empty())
{
V now = s.top();
s.pop();
g[now.x][now.y] = false;
for (int k = 0; k < 8; k++)
{
int x = now.x + dx[k];
int y = now.y + dy[k];
if (x < 0 || x >= m || y < 0 || y >= n) continue;
if (g[x][y]) s.push(V(x, y));
}
}
ans++;
}
cout << ans << endl;
}
int main()
{
// freopen("input.txt", "r", stdin);
for (;;)
{
cin >> m >> n;
if (m == 0) break;
solve();
}
}