#include<iostream>
#include<vector>
#include<queue>
#include<tuple>
#include<set>
#include<functional>
using namespace std;

const char Water = '#';
const char Earth = '.';
const char Tower = '&';

const vector<vector<int>> Next = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
enum {COST, Y, X};
typedef tuple<int, int, int> Node;

int bfs(const vector<string>& field) {
    int h = field.size();
    int w = field[0].size();

    set<tuple<int, int>> visited;
    priority_queue<Node, vector<Node>, greater<Node>> q;
    q.push(Node(0, 0, 0));
    while(!q.empty()) {
        int y = get<Y>(q.top());
        int x = get<X>(q.top());
        int cost = get<COST>(q.top());
        q.pop();
        if(field[y][x] == Tower) return cost;
        if(visited.count(tuple<int, int>(y, x))) continue;
        visited.insert(tuple<int, int>(y, x));
        for(const auto& d: Next) {
            int ny = y + d[0];
            int nx = x + d[1];
            int ncost = cost;
            if(ny < 0 || h <= ny) continue;
            if(nx < 0 || w <= nx) continue;
            if(field[y][x] == Water && field[ny][nx] != Water) ++ncost;
            q.push(Node(ncost, ny, nx));
        }
    }
    return 0;
}

int main() {
    int n, m;
    while(cin >> n >> m, n | m) {
        vector<string> field(m + 2);
        for(int i = 1; i <= m; ++i) {
            string s;
            cin >> s;
            field[i] = Earth + s + Earth;
        }
        for(int j = 0; j < n + 2; ++j) {
            field[0] += Earth;
            field[m + 1] += Earth;
        }
        cout << bfs(field) << endl;
    }
}