#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-9;
template <class T>
T RoundOff(T a) {
  return int(a + .5 - (a < 0));
}
template <class T, class C>
void chmax(T& a, C b) {
  if (a < b) a = b;
}
template <class T, class C>
void chmin(T& a, C b) {
  if (b < a) a = b;
}
template <class T, class C>
pair<T, C> mp(T a, C b) {
  return make_pair(a, b);
}
const int INF = 1 << 30;
const int hardCost = 100000;
const int dx[] = {1, 0, 0, -1};
const int dy[] = {0, 1, -1, 0};
struct P {
  int x, y;
  P(int x, int y) : x(x), y(y) {}
};
int main() {
  for (int n, m; cin >> n >> m && (n || m);) {
    P c(0, 0);
    vector<string> field(m);
    vector<vector<int> > cost(n, vector<int>(m, INF));
    for (int i = 0; i < m; i++) {
      cin >> field[i];
      int pos = field[i].find("&");
      if (pos != string::npos) {
        c.x = pos;
        c.y = i;
      }
    }
    queue<P> que;
    cost[c.x][c.y] = 0;
    for (que.push(c); !que.empty(); que.pop()) {
      P cur = que.front();
      for (int i = 0; i < 4; i++) {
        P nxt(cur.x + dx[i], cur.y + dy[i]);
        if (0 <= nxt.x && nxt.x < n && 0 <= nxt.y && nxt.y < m) {
          int ct = cost[cur.x][cur.y] + (field[nxt.y][nxt.x] == '#' ? 1 : 0);
          if (ct < cost[nxt.x][nxt.y]) {
            cost[nxt.x][nxt.y] = ct;
            que.push(nxt);
          }
        }
      }
    }
    int res = 1 << 30;
    for (int i = 0; i < n; i++) chmin(res, min(cost[i][0], cost[i][m - 1]));
    for (int i = 0; i < m; i++) chmin(res, min(cost[0][i], cost[n - 1][i]));
    cout << res << endl;
  }
}
