#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int D1[] = {0, -1},
          D2[] = {-1, 0};

int N, M;
char A[512][512];
bool is[502][502];
int nod[512][512];
vector<int> V[250010];
int nodes;

bool S[250002];
int niv[250002], T[250002];
int gomin[250002], result;

void Dfs(int x)
{
	S[x] = true;
	
	gomin[x] = 0x3f3f3f3f;
	for (vector<int>::iterator it = V[x].begin(); it != V[x].end(); ++it)
	{
		if (!S[*it])
		{
			niv[*it] = niv[x] + 1;
			T[*it] = x;
			Dfs(*it);
		}
		
		if (T[x] != *it)
			gomin[x] = min(gomin[x], min(niv[*it], gomin[*it]));
	}
	
	if (gomin[x] <= niv[x])
		++result;
}

int main()
{
	cin.sync_with_stdio(false);
	
	cin >> N >> M;
	for (int i = 1; i <= N; ++i)
		cin >> (A[i] + 1);
	
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= M; ++j)
			if (A[i][j] == '1')
			{
				nod[i][j] = ++nodes;
				for (int k = 0; k < 2; ++k)
					if (A[i + D1[k]][j + D2[k]] == '1')
					{
						V[nod[i][j]].push_back(nod[i + D1[k]][j + D2[k]]);
						V[nod[i + D1[k]][j + D2[k]]].push_back(nod[i][j]);
					}
			}
	for (int i = 1; i <= nodes; ++i)
		if (!S[i])
			Dfs(i);
	
	cout << result << '\n';
}