#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define NMAX 505
#define pii pair <int, int>
#define mp make_pair
#define x first
#define y second
#define pb push_back
using namespace std;
char A[NMAX][NMAX];
int n, m, B[NMAX][NMAX], D[NMAX][NMAX];
bool mark[NMAX][NMAX], good[NMAX][NMAX];
queue <pii> Q;
vector <pii> fin;

inline int ok(int x, int y)
{
	return 1 <= x && x <= n && 1 <= y && y <= m;
}

int dx[] = {-1, 0, 0, 1};
int dy[] = {0, -1, 1, 0};

int main()
{
	//~ freopen("input", "r", stdin);
	scanf("%d%d\n", &n, &m);
	for (int i = 1; i <= n; i++)
		fgets(A[i] + 1, NMAX, stdin);
	
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (!mark[i][j] && A[i][j] == '1')
			{
				B[i][j] = 1; D[i][j] = 0;
				Q.push(mp(i, j));
				mark[i][j] = true;
				while (!Q.empty())
				{
					int x = Q.front().x;
					int y = Q.front().y;
					//~ printf("%d %d\n", x, y);
					Q.pop();
					fin.pb(mp(x, y));
					
					for (int k = 0; k < 4; k++)
					{
						int a = x + dx[k], b = y + dy[k];
						//~ if (x == 1 && y == 1 && a == 2 && b == 1)
							//~ printf("%d %d %d\n", ok(a, b), A[a][b] == '1', !mark[a][b]);
						if (ok(a, b) && A[a][b] == '1' && (!mark[a][b] || (mark[a][b] && D[a][b] == D[x][y] + 1)))
						{
							if (!mark[a][b])
								Q.push(mp(a, b));
								
							mark[a][b] = true;
							D[a][b] = D[x][y] + 1;
							
							B[a][b] += B[x][y];
							if (B[a][b] >= 2) B[a][b] = 2;
						}
					}
				}
			}
			
	for (int i = fin.size() - 1; i >= 0; i--)
	{
		int x = fin[i].x, y = fin[i].y;
		if (D[x][y] == 2)
			good[x][y] = true;
			
		for (int k = 0; k < 4; k++)
		{
			int a = x + dx[k], b = y + dy[k];
			if (ok(a, b) && A[a][b] == '1' && B[a][b] == 2 && D[a][b] == D[x][y] + 1)
			{
				B[x][y] = 2;
				good[x][y] = true;
			}
		}
	}
	
	int res = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (good[i][j])
				res++;
				
	printf("%d\n", res);
	return 0;
}