#include<iostream>
#include<iomanip>
#include<string>
#include<queue>
#include<algorithm>

#define REP(i,a,n) for(int i=(a);i<(n);++i)

#define INV (-1)
#define N 102
#define INFTY 1<<30
#define PLANE 2
#define MOAT 1

using namespace std;

struct Node
{
	int i,j;
	int w;
	int v;
	bool vis;
};

class GreaterPNode{
public:
	bool operator()(const Node *a, const Node *b)const{
		return a->w > b->w;
	}
};

int n,m;
Node map[N][N];

bool inRange(int t, int Min, int Max){
	return Min <= t && t < Max;
}

int dijkstra(int i, int j, int gi, int gj)
{
	const int ci[] = {-1,0,1,0};
	const int cj[] = {0,1,0,-1};
	Node* p = &map[i][j];
	priority_queue<Node *, vector<Node *>, GreaterPNode > pq;

	p->w = 0;
	pq.push( p );

	while( !pq.empty() ){
		p = pq.top();
		pq.pop();

		p->vis=false;
		
		for(int k = 0; k < 4; ++k){
			int ti = p->i+ci[k], tj = p->j + cj[k];
			if( inRange( ti,1,m+1) && inRange( tj,1,n+1) ){
				int cost = 0;
				Node *q = &map[ ti ][ tj ];

				if( p->v == MOAT && q->v == PLANE ){
					cost = 1;
				}

				if( !q->vis && q->w > p->w + cost ){
					q->w = p->w + cost;
					pq.push( q );
				}
			}
		}
	}
	return -1;
}

void ResetMap(bool bAll)
{
	REP(i,0,N)REP(j,0,N){
		map[i][j].i=i;
		map[i][j].j=j;
		if( bAll ) map[i][j].v=PLANE;
		map[i][j].w=INFTY;
		map[i][j].vis=false;
	}
}

void PrintMap(){
	REP(i,1,m+1){
		REP(j,1,n+1){
			cout << setw(3) << map[i][j].w;
		}
		cout << endl;
	}
	cout << endl;
}

int main(){
	while(true){
		int gi, gj;
		int ans = INFTY;
		
		cin>>n>>m;
		if( m==0&&n==0 )break;
		
		ResetMap( true );
		
		REP(i,1,m+1){
			string s;
			cin>>s;
			REP(j,1,n+1){
				if( s[j-1] == '&'){
					gi = i;
					gj = j;
				}else if( s[j-1] == '#' ){
					map[i][j].v = MOAT;
				}
			}
		}

		REP(i,1,m+1){
			dijkstra(i,1,gi,gj);
			ans = min(ans, map[gi][gj].w);
			ResetMap( false );
		}
		REP(i,1,m+1){
			dijkstra(i,n,gi,gj);
			ans = min(ans, map[gi][gj].w);
			ResetMap( false );
		}
		REP(j,1,n+1){
			dijkstra(1,j,gi,gj);
			ans = min(ans, map[gi][gj].w);
			ResetMap( false );
		}
		REP(j,1,n+1){
			dijkstra(m,j,gi,gj);
			ans = min(ans, map[gi][gj].w);
			ResetMap( false );
		}
		cout << ans << endl;
	}
	return 0;
}