#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 30;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
class State {
 public:
  int x, y, cost;
  bool water;
  State(int _x, int _y, int _cost, bool _water)
      : x(_x), y(_y), cost(_cost), water(_water) {}
  bool operator<(const State& st) const { return this->cost > st.cost; }
};
int main() {
  int n, m;
  while (cin >> n >> m) {
    if ((n | m) == 0) break;
    int sx, sy;
    vector<string> castle(m);
    for (int i = 0; i < m; ++i) {
      cin >> castle[i];
      castle[i].insert(castle[i].begin(), '.');
      castle[i].insert(castle[i].end(), '.');
      if (castle[i].find_first_of("&") != string::npos) {
        sx = castle[i].find_first_of("&");
        sy = i;
        castle[sy][sx] = '.';
      }
    }
    castle.insert(castle.begin(), string(n + 2, '.'));
    castle.push_back(string(n + 2, '.'));
    ++sy;
    priority_queue<State> que;
    que.push(State(sx, sy, 0, false));
    vector<vector<int> > dp(m + 2, vector<int>(n + 2, INF));
    while (!que.empty()) {
      const State st = que.top();
      que.pop();
      if (st.x == 0 || st.x == n + 1 || st.y == 0 || st.y == m + 1) {
        cout << st.cost << endl;
        break;
      }
      if (dp[st.y][st.x] < st.cost) continue;
      dp[st.y][st.x] = st.cost;
      for (int d = 0; d < 4; ++d) {
        int x = st.x + dx[d];
        int y = st.y + dy[d];
        if (x < 0 || n + 2 <= x || y < 0 || m + 2 <= y) continue;
        if (st.water) {
          if (castle[y][x] == '#' && dp[y][x] > st.cost) {
            dp[y][x] = st.cost;
            que.push(State(x, y, st.cost, true));
          }
          if (castle[y][x] == '.' && dp[y][x] > st.cost + 1) {
            dp[y][x] = st.cost + 1;
            que.push(State(x, y, st.cost + 1, false));
          }
        } else {
          if (castle[y][x] == '#' && dp[y][x] > st.cost) {
            dp[y][x] = st.cost;
            que.push(State(x, y, st.cost, true));
          }
          if (castle[y][x] == '.' && dp[y][x] > st.cost) {
            dp[y][x] == st.cost;
            que.push(State(x, y, st.cost, false));
          }
        }
      }
    }
  }
  return 0;
}
