#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<unordered_set>
#include<map>
#include<unordered_map>
#include<vector>
#include<list>
#include<utility>
#include<climits>
#include<iomanip>
using namespace std;
const int N=500+50;
int n,m,vis[N][N],cnt=1;
int ans;
int k;
char ma[N][N];
bool f[N*N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
struct node{
int x,y;
};
queue<node> q;
void bfs(int a,int b){
q.push({a,b});
vis[a][b]=cnt;
while(!q.empty()){
node u=q.front();
int x=u.x,y=u.y;
q.pop();
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<0||ny<0||nx>=n||ny>=m){
f[cnt]=0;
continue;
}
if(vis[nx][ny]==1||ma[nx][ny]!='0'){
continue;
}
q.push({nx,ny});
vis[nx][ny]=cnt;
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>ma[i][j];
f[k]=1;
k++;
if(ma[i][j]=='0'&&vis[i][j]==0){
bfs(i,j);
cnt++;
}
if(f[vis[i][j]]==1&&vis[i][j]!=0){
ans++;
}
}
}
cout<<ans;
return 0;
}