#include<algorithm>
#include<bitset>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<deque>
#include<fstream>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<utility>
#include<vector>

using namespace std;

int N,M,Cnt,Sol,P,Ok,inceput;
char S[505];
int Mat[505][505];
vector<int> V[2505];
int dx[]= {0,0,-1,1};
int dy[]= {-1,1,0,0};
int Viz[2505];

void DFS(int nod)
{
    vector<int>::iterator it;
    for(it=V[nod].begin(); it!=V[nod].end() && Ok==0; it++)
    {
        if(Viz[nod]-Viz[*it]>=3 && *it==inceput) {Ok=1; return;}
        if(Viz[*it]) continue;
        Viz[*it]=Viz[nod]+1;
        DFS(*it);
    }
}

int main()
{
    int i,j,k,p=0,a,b;

    scanf("%d%d",&N,&M);

    for(i=1; i<=N; i++)
    {
        scanf("%s",S+1);
        for(j=1; j<=M; j++)
        {
            Mat[i][j]=S[j]-'0';
            if(Mat[i][j]==1) Mat[i][j]=++p;
        }
    }

    for(i=1; i<=N; i++)
        for(j=1; j<=M; j++)
            for(k=0; k<4; k++)
            {
                a=i+dx[k];
                b=j+dy[k];
                if(Mat[a][b]) V[Mat[i][j]].push_back(Mat[a][b]);
            }

    P=p;

    for(i=1; i<=P; i++)
    {
        memset(Viz,0,sizeof(Viz));
        Ok=0;
        inceput=i;
        Viz[i]=1;
        DFS(i);
        Sol+=Ok;
    }

    printf("%d\n",Sol);

    return 0;
}