#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const vector<vector<int>> directions = {{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0},{-1, 1}, {0, 1}, {1, 1}};
void solveMethod(int n, int m, vector<vector<int>>& matrix)
{
int times = 0;
for (int x = 0; x < n; x++)
{
for (int y = 0; y < m; y++)
{
int cur = matrix[x][y];
if (cur == 1)
{
times++;
queue<vector<int>> changed;
changed.push({x, y});
while (!changed.empty())
{
auto front = changed.front();
changed.pop();
for (auto& d : directions)
{
int newX = front[0] + d[0];
int newY = front[1] + d[1];
if (newX >= 0 && newX < n && newY >= 0 && newY < m && matrix[newX][newY] == 1)
{
matrix[newX][newY] = 0;
changed.push({newX, newY});
}
}
}
}
}
}
cout << times << endl;
}
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int>> matrix(n, vector<int>(m));
for (int x = 0; x < n; x++)
{
for (int y = 0; y < m; y++)
{
cin >> matrix[x][y];
}
}
solveMethod(n, m, matrix);
return 0;
}
#include <iostream>
using namespace std;
bool k[10001];
int m,n,ans=0;
int l[10001]={
0};
void search(int x,int ll){
if (l[x]>0 || !k[x]) return;
if (x==ll-1) ans++;
l[x]=ll;
int xm=x/m;
int xn=x%m;
if (xn>0) search(x-1,ll);
if (xn<m-1)
search(x+1,ll);
if (xm>0){
search(x-m,ll);
if (!k[x-m]){
if (xn>0) search(x-m-1,ll);
if (xn<m-1) search(x-m+1,ll);
}
}
if (xm<n-1){
search(x+m,ll);
if (!k[x+m]){
if (xn>0) search(x+m-1,ll);
if (xn<m-1) search(x+m+1,ll);
}
}
}
int main(){
cin>>n>>m;
for (int i=0;i<m*n;i++)
cin>>k[i];
for (int i=0;i<m*n;i++){
if (k[i]) search(i,i+1);
}
cout<<ans<<endl;
}