#include <iostream>
#include <fstream>
#include <queue>
#include <string>
#include <vector>

using namespace std;

ifstream f("fisier.txt");

struct point{

    int i, j, value;

};



void citire(vector< vector<int> > &v, int n, int m){

    int i, j, nr;
    char line[101];
    for(i=0; i<n; i++){
        cin.getline(line, 255);
        for(j=0; j<m; j++){

            if(line[j]=='.')
                nr=0;
            else nr=-1;
            v[i][j]=nr;
        }
    }
}

void afisare(vector< vector<int> > &v, int n, int m){

    int i, j;
    for(i=0; i<n; i++){
        for(j=0; j<m; j++)
            cout << v[i][j];
        cout << endl;
    }

}

int solution(vector< vector<int> > &v, int n, int m){


    int finishPoint=0, actualI, actualJ;
    queue<point> coada;
    point start, lastElement, newElement;
    start.i = 0;
    start.j = 0;
    start.value = 1;
    v[0][0]=1;
    coada.push(start);


    while(!coada.empty()){

        lastElement = coada.front();
        finishPoint = lastElement.value;

        coada.pop();

        actualI = lastElement.i;
        actualJ = lastElement.j;

        if(actualJ+1<m)
            if(v[actualI][actualJ+1]==0){
                newElement.i = actualI;
                newElement.j = actualJ+1;
                newElement.value = finishPoint+1;
                v[actualI][actualJ+1] = finishPoint+1;
                coada.push(newElement);
            }

        if(actualI+1<n)
            if(v[actualI+1][actualJ]==0){
                newElement.i = actualI+1;
                newElement.j = actualJ;
                newElement.value = finishPoint+1;
                v[actualI+1][actualJ] = finishPoint+1;
                coada.push(newElement);
        }

    }

    return finishPoint;


}



int main()
{
    int n, m;
    cin >> n >> m;
    cin.get();

    vector< vector<int> > v(n,vector<int>(m));

    citire(v, n, m);
    cout << solution(v, n, m);
    return 0;
}