import java.util.*;
public class Main {
public static int n;
public static int m;
public static int[][] arr;
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
kb.nextLine();
arr = new int[n][m];
for(int i = 0; i < n; i++) {
String str = kb.nextLine();
for(int j = 0; j < m; j++) {
arr[i][j] = str.charAt(j) - '0';
}
}
System.out.println(Arrays.deepToString(arr));
//아이스크림 갯수 카운트
int cnt = 0;
//모든 위치에 대해 아이스크림 만들 수 있는지 확인
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(DFS(i,j)) cnt++;
}
}
System.out.println(cnt);
}
private static boolean DFS(int x, int y) {
//범위를 벗어나는 경우에는 바로 리턴시켜버린다.
if(x < 0 || y < 0 || x >= n || y >= m) return false;
//구멍이 뚫려있으면 무조건 아이스크림 만들 수 있는거니까 밑에 true 리턴
//여러 번 호출해서 true 나 false를 리턴한다고 해도 최종적인 리턴값은 true임
if(arr[x][y] == 0) {
//상하좌우 탐색해서 아이스크림 만들기
arr[x][y] = 1;
DFS(x-1, y);
DFS(x+1, y);
DFS(x, y-1);
DFS(x, y+1);
//전부다 탐색했으면 true를 리턴해준다.
return true;
}
return false;
}
}