import java.io.BufferedInputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import org.omg.PortableInterceptor.INACTIVE;
public class Main{
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(new BufferedInputStream(System.in)) ;
PrintWriter cout = new PrintWriter(System.out);
while(cin.hasNext()){
int n = cin.nextInt() , m = cin.nextInt() ;
if(n == 0) break ;
new Task().solve(n, m , cin , cout) ;
}
cout.flush() ;
}
}
class Task{
char[][] str ;
boolean[][] vis ;
int[][] dir = new int[][]{{-1,0},{0,-1},{1,0},{0,1},{-1,1},{1,-1},{-1,-1},{1,1}} ;
int n , m ;
public boolean can(int x , int y){
return 0 <= x && x < n && 0 <= y && y < m ;
}
public void solve(int n , int m , Scanner cin , PrintWriter cout){
this.n = n ; this.m = m ;
str = new char[n][m] ;
for(int i = 0 ; i < n ; i++) str[i] = cin.next().toCharArray() ;
vis = new boolean[n][m] ;
int sum = 0 ;
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(! vis[i][j] && str[i][j] == '@'){
sum++ ;
dfs(i , j) ;
}
}
}
cout.println(sum) ;
// cout.flush() ;
}
public void dfs(int x , int y){
vis[x][y] = true ;
for(int i = 0 ; i < dir.length ; i++){
int nx = x + dir[i][0] ;
int ny = y + dir[i][1] ;
if(can(nx , ny) && ! vis[nx][ny] && str[nx][ny] == '@') dfs(nx, ny) ;
}
}
}