#include <cstdio>
#include <cstdlib>
#include <queue>
#include <functional>
using namespace std;

/** 東西の幅 */
int w;
#define W 100
/** 南北の幅 */
int h;
#define H 100
/** 見取り図 */
char map[ W ][ H ];

/** 指定された座標が範囲内かを判定する */
#define nanikaka(X,Y) \
  ( (X) >= 0 && (X) < w && (Y) >= 0 && (Y) < h )

/** 速度x 座標 */
#define VN 4
const int vx[ VN ] = { -1,  1,  0,  0 };
const int vy[ VN ] = {  0,  0, -1,  1 };

/** 重み付き座標 */
struct point
{
  int x;
  int y;
  int weight;

  point (
    int x,
    int y,
    int weight
    )
  {
    this->x      = x;
    this->y      = y;
    this->weight = weight;
  }

  bool
  operator> (
    const point &p
    )
  const
  {
    return ( weight > p.weight );
  }
};

int
main (
  int   argc,
  char *argv[ ]
  )
{
  int i, j;

  for ( ; ; )
  {
    priority_queue<point, vector<point>, greater<point> > lis;

    /* 基本情報読み込み */
    scanf ( " %d %d", &w, &h );
    if ( w == 0 && h == 0 ) break ;

    /* 見取り図読み込み */
    for ( i = 0; i < h; ++i )
    for ( j = 0; j < w; ++j )
    {
      scanf ( " %c", &map[ j ][ i ] );

      /* 天守閣を検出したら探索開始点として記録 */
      if ( map[ j ][ i ] == '&' )
      {
        map[ j ][ i ] = '.';
        lis.push ( point ( j, i, 0 ) );
      }
    }

    /* 天守閣から城外方向に堀優先探索 */
    while ( !lis.empty ( ) )
    {
      const point pt = lis.top ( );
      lis.pop ( );

      /* 城外に到達したら処理終了 */
      if ( !nanikaka ( pt.x, pt.y ) )
      {
        printf ( "%d\n", pt.weight );
        break ;
      }
      /* 既に探索済みなら処理しない */
      if ( map[ pt.x ][ pt.y ] == '&' )
        continue ;

      /* 隣接座標の探索を予約．堀脱出な移動には重みを加算． */
      for ( i = 0; i < VN; ++i )
      {
        const int nx = pt.x + vx[ i ];
        const int ny = pt.y + vy[ i ];
        lis.push ( point ( nx, ny, pt.weight + !!( nanikaka ( nx, ny )
                                                && map[ pt.x ][ pt.y ] != '#'
                                                && map[ nx ][ ny ] == '#' ) ) );
      }
      /* 探索済みのマークをつける */
      map[ pt.x ][ pt.y ] = '&';
    }
  }

  return ( EXIT_SUCCESS );
}