#include <iostream>

using namespace std;

int  *solid;
int n,m;  //n=x m=y;

struct Vector2
{
    Vector2(int X,int Y)
    {
        x=X;
        y=Y;
    }
    Vector2(){x=0;y=0;}
    int x;
    int y;
};
int getTile(int *a,int x,int y)
{
    return a[y*n+x];
}
void setTile(int *a,int x,int y,int val)
{
    a[y*n+x]=val;
}

int main()
{
    cin>>n>>m;
//  l=new int[n*m];
    solid=new int[m*n];


    for(int y=0; y<m; y++)
    {
        string s;
        cin>>s;
        for(int x=0; x<n; x++)
            setTile(solid,x,y,s[x]);
    }

    bool done=false;

    Vector2 directions[]= {Vector2(0,1),Vector2(1,0)};

    Vector2 queue[200];

    queue[0]=Vector2(0,0);

    int p=0,u=1,lastChecked=1;

    setTile(solid,0,0,1);


    while(p!=u)
    {
        lastChecked=getTile(solid,queue[p].x,queue[p].y);
        for(int i=0; i<2; i++)
        {
            if(directions[i].x+queue[p].x>=0 && directions[i].x+queue[p].x<n &&
                    directions[i].y+queue[p].y>=0 && directions[i].y+queue[p].y<m &&
                    getTile(solid,directions[i].x+queue[p].x,directions[i].y+queue[p].y)==46)
            {
                queue[u++]=Vector2(directions[i].x+queue[p].x,directions[i].y+queue[p].y);
                setTile(solid,directions[i].x+queue[p].x,directions[i].y+queue[p].y,getTile(solid,queue[p].x,queue[p].y)+1);
            }

        }
        p++;
    }

    for(int y=0;y<m;y++)
    {
        for(int x=0;x<n;x++)
        cout<<getTile(solid,x,y)<<" ";
        cout<<endl;
    }
    cout<<lastChecked;


    return 0;
}