#include <set>
#include <cstdlib>
#include <climits>
#include <iostream>
#include <queue>
#define REP(i,n) for(int i=0; i<(int)(n); i++)

#define IN(x,s,g) ((x) >= (s) && (x) < (g))
#define ISIN(x,y,w,h) (IN((x),0,(w)) && IN((y),0,(h)))

const int _dx[] = {0,1,0,-1};
const int _dy[] = {-1,0,1,0};

using namespace std;

int main(){
  int w, h;
  while(cin >> w >> h, w + h){
    vector<string> g(h);
    int sx, sy;

    REP(i,h) cin >> g[i];

    REP(i,h) REP(j,w) if(g[i][j] == '&'){
      g[i][j] = '.';
      sx = j; sy = i;
    }

    typedef pair<int, pair<int, int> > data;
    priority_queue<data, vector<data>, greater<data> > q;
    vector<vector<int> > memo(h, vector<int>(w, -1));

    int ans = INT_MAX;

    q.push(make_pair(0, make_pair(sx, sy)));

    while(q.size()){
      const auto d = q.top(); q.pop();
      const int cost = d.first;
      const int x = d.second.first;
      const int y = d.second.second;

      if(ISIN(x, y, w, h) && memo[y][x] != -1) continue;
      if(ISIN(x, y, w, h)) memo[y][x] = cost;

      if(!ISIN(x, y, w, h)){
	ans = min(ans, cost);
      }else{
	const char prev = g[y][x];
	REP(i,4){
	  const int xx = x + _dx[i];
	  const int yy = y + _dy[i];
	  if(!ISIN(xx, yy, w, h) || memo[yy][xx] == -1){
	    const char next = ISIN(xx, yy, w, h) ? g[yy][xx] : '.';
	    const int cc = prev == '.' && next == '#' ? cost + 1 : cost;
	    q.push(make_pair(cc, make_pair(xx, yy)));
	  }
	}
      }
    }

    cout << ans << endl;
  }
  return 0;
}