#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#define sf scanf
#define pf printf
#define mem(vis,a) memset(visit,a,sizeof(visit));
using namespace std;
char g[100][100];
int n,m;
int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
int visit[100][100];
void dfs(int x,int y)
{
for(int i=0;i<8;i++)
{
int nx,ny;
nx=x+dir[i][0];
ny=y+dir[i][1];
if(nx<n&&nx>=0&&ny<m&&ny>=0&&g[nx][ny]=='@'&&!visit[nx][ny])
{
visit[nx][ny]=1;
dfs(nx,ny);
}
}
}
int main()
{
while(cin>>n>>m&&(n+m))
{
mem(visit,0);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
int ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(g[i][j]=='@'&&!visit[i][j])
{
visit[i][j]=1;
dfs(i,j);
++ans;
}
}
cout<<ans<<endl;
}
}
#include <iostream>//BFS
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#define sf scanf
#define pf printf
#define mem(vis,a) memset(visit,a,sizeof(visit));
using namespace std;
struct point{
int x;
int y;point(){}
point(int x,int y){this->x=x;this->y=y;}
};
char g[100][100];
int n,m;
int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
int visit[100][100];
void bfs(int x,int y)
{
queue<point>Q;
Q.push(point(x,y));
visit[x][y]=1;
while(!Q.empty())
{
point np=Q.front();
Q.pop();
for(int i=0;i<8;i++)
{
int nx,ny;
nx=np.x+dir[i][0];
ny=np.y+dir[i][1];
if(nx<n&&nx>=0&&ny<m&&ny>=0&&g[nx][ny]=='@'&&!visit[nx][ny])
{
visit[nx][ny]=1;
Q.push(point(nx,ny));
}
}
}
}
int main()
{
while(cin>>n>>m&&(n+m))
{
mem(visit,0);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
int ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(g[i][j]=='@'&&!visit[i][j])
{
bfs(i,j);
++ans;
}
}
cout<<ans<<endl;
}
return 0;
}