#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;
typedef pair<int, int> P;
static const int INF = 1e9;
static const int dx[] = {1, 0, -1, 0};
static const int dy[] = {0, -1, 0, 1};

void solve()
{
	int n, m;
	while (cin >> n >> m, n || m)
	{
		P start;
		vector< vector<char> > field(m, vector<char>(n));
		for (int i = 0; i < m; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				cin >> field[i][j];
				if (field[i][j] == '&')
				{
					start.first = j;
					start.second = i;
				}
			}
		}
		queue<P> Que;
		Que.push(start);
		queue<P> wallQue;
		vector< vector<int> > fieldStep(m, vector<int>(n));
		for (int i = 0; i < m; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				fieldStep[i][j] = INF;
			}
		}
		fieldStep[start.second][start.first] = 0;
		int cnt = 0;
		while (true)
		{
			while (!Que.empty())
			{
				P cur = Que.front();
				Que.pop();
				for (int i = 0; i < 4; ++i)
				{
					P next;
					next.first = cur.first + dx[i];
					next.second = cur.second + dy[i];
					if (!(0 <= next.first && next.first < n && 0 <= next.second && next.second < m) || fieldStep[next.second][next.first] != INF)
					{
						continue;
					}
					else
					{
						fieldStep[next.second][next.first] = cnt;
						if (field[next.second][next.first] == '#')
						{
							wallQue.push(next);
						}
						else
						{
							Que.push(next);
						}
					}
				}
			}
			while (!wallQue.empty())
			{
				Que.push(wallQue.front());
				wallQue.pop();
			}
			++cnt;
			if (Que.empty())
			{
				break;
			}
		}
		int minv = INF;
		for (int i = 0; i < n; ++i)
		{
			if (field[0][i] != '#')
			{
				minv = min(minv, fieldStep[0][i]);
			}
			if (field[m - 1][i] != '#')
			{
				minv = min(minv, fieldStep[m - 1][i]);
			}
		}
		for (int i = 0; i < m; ++i)
		{
			if (field[i][0] != '#')
			{
				minv = min(minv, fieldStep[i][0]);
			}
			if (field[i][n - 1] != '#')
			{
				minv = min(minv, fieldStep[i][n - 1]);
			}
		}
		cout << minv << endl;
	}
}

int main()
{
	solve();
	return(0);
}