#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <cstring>

using namespace std;

int h,w;
char field[101][101];
bool passed[101][101];
const int dy[]={-1,0,0,1};
const int dx[]={0,-1,1,0};

queue<pair<int,int> > *prv;
queue<pair<int,int> > *nxt;

bool ok;

void dfs(int y,int x){
    if(y==h-1||y==0||x==0||x==w-1){
        ok=true;
        return;
    }
    for(int i = 0; i < 4; i++){
        int ny=y+dy[i];
        int nx=x+dx[i];
        if(ny>=0&&nx>=0&&ny<h&&nx<w&&!passed[ny][nx]){
            passed[ny][nx]=true;
            // ツ堀ツづ按づァnxtツづ英ushツつオツづ終ツ猟ケ
            if(field[ny][nx]=='#')
                nxt->push(make_pair(ny,nx));
            else
                dfs(ny,nx);
            if(ok)return;
        }
    }
}
int main(){
    prv=new queue<pair<int,int> >();
    nxt=new queue<pair<int,int> >();
    while(cin>>w>>h&&!(h==0&&w==0)){
        ok=false;
        memset(passed,0,sizeof(passed));
        int sy,sx;
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                cin>>field[i][j];
                if(field[i][j]=='&'){
                    sy=i,sx=j;
                    field[i][j]='.';
                }
            }
        }
        prv->push(make_pair(sy,sx));
        int cnt=0;
        while(prv->size()){
            while(prv->size()){
                pair<int,int> &p=prv->front();
                passed[p.first][p.second]=true;
                dfs(p.first,p.second);
                prv->pop();
                if(ok)
                    break;
            }
            if(ok)break;
            swap(prv,nxt);
            cnt++;
        }
        cout<<cnt<<endl;
        while(prv->size())prv->pop();
        while(nxt->size())nxt->pop();
    }
    delete nxt;
    delete prv;
    return 0;
}