Problem: Now, a ninja is planning to sneak into the castle tower from outside the castle. This ninja can easily run on the ground and swim in the moat, but he is not very good at climbing up from the moat, so he wants to enter the moat as few times as possible.

Create a program that takes a sketch of the castle as input and outputs the minimum number of times you have to crawl up from the moat from outside the castle to the castle tower. The sketch of the castle is given as a two-dimensional grid. The symbols drawn on the sketch show the positions of "&" indicating the position of the castle tower and "#" indicating the position of the moat, and "." (Half-width period) at other points. In addition, it is assumed that there is only one castle tower in the castle, and the ninja moves one square at a time in the north, south, east, and west directions when running or swimming, and does not move diagonally.



Input

A sequence of multiple datasets is given as input. The end of the input is indicated by two lines of zeros. Each dataset is given in the following format:


n m
c1,1 c1,2 ... c1, n
c2,1c2,2 ... c2, n
::
cm, 1cm, 2 ... cm, n


The first line gives the east-west width n and the north-south width m (1 ≤ n, m ≤ 100) of the sketch. The following m lines give the information on the i-th line of the sketch. Each piece of information is a character string of length n consisting of the symbols "&", "#", and ".".

The number of datasets does not exceed 50.

Output

Outputs the minimum number of times (integer) that must be climbed from the moat for each dataset on one line.

Examples

Input

5 5
.###.
#...#
#.&.#
#...#
.###.
18 15
..####....####....
####..####....####
#...............##
.#.############.##
#..#..........#.##
.#.#.########.#.##
#..#.#......#.#.##
.#.#....&...#.#.##
#..#........#.#.##
.#.#.########.#.##
#..#..........#.##
.#.############.##
#...............##
.#################
##################
9 10
#########
........#
#######.#
#.....#.#
#.###.#.#
#.#&#.#.#
#.#...#.#
#.#####.#
#.......#
#########
9 3
###...###
#.#.&.#.#
###...###
0 0


Output

1
2
0
0


Input

5 5
.###.
...#
.&.#
...#
.###.
18 15
..####....####....
..####....####
...............##
.#.############.##
..#..........#.##
.#.#.########.#.##
..#.#......#.#.##
.#.#....&...#.#.##
..#........#.#.##
.#.#.########.#.##
..#..........#.##
.#.############.##
...............##
.#################

9 10

........#
.#
.....#.#
.###.#.#
.#&#.#.#
.#...#.#
.#####.#
.......#

9 3
...###
.#.&.#.#
...###
0 0
</pre>


Output

1
2
0
0

Solution (in CPP):

Solution:

#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <memory>
#include <string>

#include <algorithm>
#include <complex>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <bitset>

using namespace std;

#ifdef _MSC_VER
#define __typeof__ decltype
#define strtok_r strtok_s
#endif

#define ITER(c)             __typeof__((c).begin())
#define FOREACH(it, c)      for (ITER(c) it=(c).begin(); it != (c).end(); ++it)
#define RITER(c)            __typeof__((c).rbegin())
#define RFOREACH(it, c)     for (RITER(c) it=(c).rbegin(); it != (c).rend(); ++it)
#define REP(i, n)           REPEAT(i, 0, n)
#define RREP(i, n)          RREPEAT(i, 0, n)
#define REPEAT(i, k, n)     for(int i = (k); i < ((k)+(n)); ++i)
#define RREPEAT(i, k, n)    for(int i = (k)+(n)-1; i >= (k); --i)
#define FROMTO(i,f,t)       for(int i = f; i < t; i++)
#define ALL(c)              (c).begin(), (c).end()
#define LLPOW(p1,p2)        ((ll)pow((double)(p1), (int)p2))
#define ESIZEOF(A)          (sizeof(A)/sizeof((A)[0]))
#define CIN_NO_SYNC         do { cin.tie(0); ios_base::sync_with_stdio(false); } while(0)
#define GETSTR(p)           fgets((p), sizeof(p), stdin)
#define CHOMP(p)            do{ char *_q = (p) + strlen(p)-1; if(*_q == '\n' || *_q == '\r') *_q = 0; } while(0)
#define FILL(m,v)           memset(m, v, sizeof(m))
#define mp                  make_pair
#define pb                  push_back
template<class _T> _T MAX(_T p1,_T p2){return (p1>p2)?p1:p2;} 
template<class _T> _T MIN(_T p1,_T p2){return (p1<p2)?p1:p2;} 
template <class _Tv> inline string join(const _Tv &v,string sep=" "){
    ostringstream s;FOREACH(it,v){if(it!=v.begin())s<<sep;s<<*it;};return s.str();
}

typedef long long ll;
typedef unsigned long long ull;
typedef double D;
typedef complex<D> P;
typedef vector<int> VI;
typedef vector<VI> VVI;
#define X real()
#define Y imag()
#define EPS (1e-9)
#define DEQ(p1,p2) (abs((p1)-(p2)) < EPS)

#ifdef _DEBUG
template<class _Tv> inline void _prfe(const char *_n,const _Tv _c,bool _p=false){
    ITER(_c) _it=_c.begin();
    if(_p){cout<<_n<<" = ["<<endl;for(;_it!=_c.end();++_it)cout<<"    "<<*_it<<endl;cout<<"]"<<endl; }
    else{cout<<_n<<" = [ "<<*_it++;for(;_it!=_c.end();++_it)cout<<", "<<*_it;cout<<" ]"<<endl; }
}
#define pf printf
#define pr(n) do{cout<<#n" = "<<(n)<<endl;}while(0)
#define prfe(n) _prfe(#n, n)
#define prfep(n) _prfe(#n, n, true)
#define dbgchk(n) do{if(n)throw;}while(0)
#else
#define pf(...) /* */
#define pr(...) /* */
#define prfe(...) /* */
#define prfep(...) /* */
#define dbgchk(...) /* */
#endif

const int dir[][2] = {{1,0},{0,1},{-1,0},{0,-1},{1,-1},{1,1},{-1,1},{-1,-1}};

int main(){
    int w,h;

    while(cin >> w >> h){
        if(w == 0 && h == 0) break;
        VVI vvi(h+2);
        REP(y,h+2) vvi[y].resize(w+2);
        int gx = 0, gy = 0;
        REP(y,h){
            string s;
            cin >> s;
            REP(x,w){
                if(s[x] == '&') gx = x+1, gy = y+1;
                if(s[x] == '#') vvi[y+1][x+1] = 1;
            }
        }
        w += 2; h += 2;
        pr(w); pr(h);

        VVI inq(h, vector<int>(w));
        VVI cost(h, vector<int>(w,INT_MAX));
        deque<pair<int,int> > q;
        q.pb(mp(0,0));
        cost[0][0] = 0;
        while(!q.empty()){
            int x = q.front().first;
            int y = q.front().second;
            q.pop_front();
            inq[y][x] = 0;
            REP(i,4){
                int mx = x + dir[i][0];
                int my = y + dir[i][1];
                if(mx < 0 || my < 0 || mx >= w || my >= h) continue;
                int c = (vvi[y][x] == 1 && vvi[my][mx] == 0) ? 1 : 0;
                if(cost[my][mx] > cost[y][x] + c){
                    cost[my][mx] = cost[y][x] + c;
                    if(!inq[my][mx]){
                        q.pb(mp(mx,my));
                        inq[my][mx] = true;
                    }
                }
            }
        }
        cout << cost[gy][gx] << endl;
    }
    return 0;
}