#include <bits/stdc++.h>
using namespace std;
struct pos {
  int x, y;
  int cost;
  pos() {}
  pos(int x_, int y_, int cost_) {
    x = x_;
    y = y_;
    cost = cost_;
  }
  bool operator<(const pos p) const { return cost > p.cost; }
};
const int INF = 1000000;
int main() {
  int n, m;
  while (cin >> n >> m, n | m) {
    char in[128][128];
    int cost[128][128];
    for (int i = 0; i < 128; i++) {
      for (int j = 0; j < 128; j++) {
        in[i][j] = '.';
        cost[i][j] = INF;
      }
    }
    for (int i = 0; i < m; i++) {
      scanf("%s", in[i + 1] + 1);
      in[i + 1][n + 1] = '.';
    }
    priority_queue<pos> q;
    for (int i = 1; i < m + 1; i++) {
      for (int j = 1; j < n + 1; j++) {
        if (in[i][j] == '&') {
          q.push(pos(j, i, 0));
          i = m + 1;
          j = n + 1;
        }
      }
    }
    int dx[] = {-1, 1, 0, 0};
    int dy[] = {0, 0, -1, 1};
    int ans = -1;
    while (!q.empty()) {
      pos p;
      p = q.top();
      q.pop();
      if (cost[p.y][p.x] == INF) {
        if (p.x <= 0 || n + 1 <= p.x || p.y <= 0 || m + 1 <= p.y) {
          ans = p.cost;
          break;
        }
        cost[p.y][p.x] = p.cost;
        for (int i = 0; i < 4; i++) {
          if (cost[p.y + dy[i]][p.x + dx[i]] == INF) {
            int c = p.cost;
            if (in[p.y][p.x] == '.' && in[p.y + dy[i]][p.x + dx[i]] == '#') {
              c++;
            }
            q.push(pos(p.x + dx[i], p.y + dy[i], c));
          }
        }
      }
    }
    cout << ans << endl;
  }
}
