#include <bits/stdc++.h>
using namespace std;
 
using ll = long long int;
using ull = unsigned long long int;
using P = pair<int, int>;
using P3 = pair<int,P>;
using PP = pair<P ,P>;
constexpr ll MOD = ll(1e9+7);
constexpr int IINF = INT_MAX;
constexpr ll LLINF = LLONG_MAX;
constexpr int MAX_N = int(1e5) + 5;
constexpr double EPS = 1e-8;
constexpr int di[] = {0, 1, 0, -1}, dj[] = {1, 0, -1, 0};

int d[105][105];
vector<string> s;

int main(){
    int w, h;
    while(cin >> w >> h, w){
        s.resize(h);
        int si, sj;
        for(int i=0;i<h;i++){
            cin >> s[i];
            for(int j=0;j<w;j++){
                if(s[i][j] == '&'){
                    si = i;
                    sj = j;
                }
            }
        }
        for(int i=0;i<h;i++){
            fill(d[i], d[i]+w, IINF);
        }
        d[si][sj] = 0;
        deque<P> que;
        que.push_back(P(si,sj));
        while(!que.empty()){
            P p = que.front();
            que.pop_front();
            int i = p.first, j = p.second;
            for(int k=0;k<4;k++){
                int ni = i+di[k], nj = j+dj[k];
                if(ni < 0 || ni >= h) continue;
                if(nj < 0 || nj >= w) continue;
                if(s[i][j] != '#' && s[ni][nj] == '#'){
                    if(d[ni][nj] > d[i][j] + 1){
                        d[ni][nj] = d[i][j] + 1;
                        que.push_back(P(ni,nj));
                    }
                }else{
                    if(d[ni][nj] > d[i][j]){
                        d[ni][nj] = d[i][j];
                        que.push_front(P(ni,nj));
                    }
                }
            }
        }
        int ans = IINF;
        for(int i=0;i<h;i++){
            ans = min(ans, min(d[i][0], d[i][w-1]));
        }
        for(int j=0;j<w;j++){
            ans = min(ans, min(d[0][j], d[h-1][j]));
        }
        cout << ans << endl;
    }
    return 0;
}
