#include <iostream>
#include <string>
#include <queue>
using namespace std;
struct point
{
    int x,y;
};
queue<point> c;
point a,b;
char A[101][101];
int B[101][101];
int maxx=0;
int n,m;
int ii;
bool ok(int k,int x,int y)
{
    if (x>=n || y>=m)
        return false;
    if (A[x][y]!='.')
        return false;
    if (k>maxx)
        maxx=k;
    return true;
}

void back(int k,int x,int y)
{
    //cout<<x<<" "<<y<<'\n';
    if (ok(k,x,y))
    {
        back(k+1,x+1,y);
        back(k+1,x,y+1);
    }
}

void lee(point a)
{
    point b;
    c.push(a);
    B[a.x][a.y]=1;
    while (!c.empty())
    {
        a=c.front();
        c.pop();
        //cout<<a.x<<' '<<a.y<<'\n';
        if (a.x+1<n && A[a.x+1][a.y]=='.' &&  B[a.x+1][a.y]==0 )
        {
            b.x=a.x+1;
            b.y=a.y;
            c.push(b);
            B[b.x][b.y]=B[a.x][a.y]+1;
            if (B[b.x][b.y]>maxx)
                maxx=B[b.x][b.y];
        }
        if (a.y+1<m && A[a.x][a.y+1]=='.' &&  B[a.x][a.y+1]==0)
        {
            b.x=a.x;
            b.y=a.y+1;
            c.push(b);
            B[b.x][b.y]=B[a.x][a.y]+1;
            if (B[b.x][b.y]>maxx)
                maxx=B[b.x][b.y];
        }
    }
}

int main()
{
    a.x=0;
    a.y=0;
    cin>>n>>m;
    for (int i=0;i<n;++i)
        for (int j=0;j<m;++j)
            cin>>A[i][j];
    if (A[0][0]=='&')
        cout<<0;
    else
    {
        lee(a);
        cout<<maxx;
    }
    return 0;
}