#include <iostream>
#include <cstdio>
#include <queue>
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));
					}
				}
			}
		}

		/*
		for(int i = 1; i < m + 1; i++) {
			for(int j = 1; j < n + 1; j++) {
				cout << (cost[i][j] == INF ? in[i][j] : '*');
			}
			cout << endl;
		}
		*/
		cout << ans << endl;
	}
}