#include<bits/stdc++.h>
using namespace std;
inline int read()//快读
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
int n,m,cnt=0;
int p[105][105];
bool flag[105][105];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
string a;
struct bf{
int x,y;
}q[10005];//q数组模拟队列
void bfs(int x,int y)
{
int h=0,t=1;//h表示队首,t表示队尾
q[1].x=x;q[1].y=y;//将起始点存入队列中
while(h<t)//表示队列不为空
{
h++;//队首向后移(队首前面的节点已经找完了临近点)
x=q[h].x;y=q[h].y;//取出队首坐标
flag[x][y]=1;//标记
for(int i=0;i<4;i++)//遍历4个方向
{
int cx=x+dx[i];
int cy=y+dy[i];
if(p[cx][cy]&&!flag[cx][cy])//如果有数字且未被标记就加入队尾
{
q[++t].x=cx;//队尾后移,加入新的坐标
q[t].y=cy;
}
}
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
{
cin>>a;//用字符串类型读入
for(int j=0;j<m;j++)
p[i][j+1]=a[j]-48;//转化成整型方便编写代码
}
for(int i=1;i<=n;i++)//枚举每一个点
for(int j=1;j<=m;j++)
if(!flag[i][j]&&p[i][j])//如果遇到了未被标记的数字点,就以此为起点搜索,表示找到了一个细胞
{
cnt++;//记录细胞数量
bfs(i,j);
}
printf("%d",cnt);
return 0;
}