#include <bits/stdc++.h>
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]) {
      if (field[ny][nx] == '#') {
        passed[ny][nx] = true;
        nxt->push(make_pair(ny, nx));
      } else {
        passed[ny][nx] = true;
        dfs(ny, nx);
      }
    }
  }
}
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();
        dfs(prv->front().first, prv->front().second);
        prv->pop();
      }
      swap(prv, nxt);
      if (ok) break;
      cnt++;
    }
    cout << cnt << endl;
    while (prv->size()) prv->pop();
    while (nxt->size()) nxt->pop();
  }
  delete nxt;
  delete prv;
  return 0;
}
