#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <cstring>
#include <deque>
#include <cstdio>
#include <cmath>
#include <complex>
#include <iostream>
#include <iterator>

using namespace std;

#define reep(i,f,t) for(int i=f ; i<int(t) ; ++i)
#define rep(i,n) reep(i, 0, n) 

typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> pii;

char field[128][128];
int memo[128][128];
int w, h;

void fillup(int y, int x, int num, char c)
{
	memo[y][x] = num;
	
	const int dy[] = {-1, 0, 0, 1};
	const int dx[] = {0, 1, -1, 0};
	
	rep(i, 4){
		int py = y + dy[i];
		int px = x + dx[i];
		if(py<0 || h<=py || px<0 || w<=px || (memo[py][px] != -2 && memo[py][px] != -1))
			continue;
		
		if(field[py][px] != c)
			memo[py][px] = -2;
		else
			fillup(py, px, num, c);
	}
}

int main()
{
	while(scanf("%d%d", &w, &h), w){
		int y, x;
		rep(i, h){
			scanf("%s", field[i+1]+1);
			rep(j, w){
				if(field[i+1][j+1] == '&'){
					y = i + 1;
					x = j + 1;
					field[y][x] = '.';
				}
			}
		}
		
		h += 2;
		w += 2;
		fill_n(field[0], w, '.');
		fill_n(field[h-1], w, '.');
		rep(i, h)
			field[i][0] = field[i][w-1] = '.';
		
		rep(i, h)
			fill_n(memo[i], w, -1);
		
		memo[y][x] = -2;
		for(int i=0;; ++i){
			const char chars[] = {'#', '.'};
			bool found = false;
			rep(l, 2){
				rep(j, h) rep(k, w){
					if(field[j][k] == chars[l] && memo[j][k] == -2){
						found = true;
						fillup(j, k, i, chars[l]);
					}
				}
			}
			if(!found)
				break;
		}
		printf("%d\n", memo[0][0]);
	}

	return 0;
}