# Include < Stdio. h >
# Define Maxn 21
Int Map [maxn] [maxn];
Int Startx, starty;
Int W, H, OK, minmove;
Int Dr [ 4 ] [ 2 ] = {{ 1 , 0 },{ - 1 , 0 },{ 0 , 1 },{ 0 , - 1 }};
Int Legal ( Int X, Int Y ){
If (X > = 1 && Y > = 1 && X <= H && Y <= W)
Return 1 ;
Return 0 ;
}
Void In (){
Int I, J;
For (I = 1 ; I <= H; ++ I ){
For (J = 1 ; J <= W; ++ J ){
Scanf ( " % D " , & Map [I] [J]);
If (Map [I] [J] = 2 ){
Startx = I;
Starty = J;
Map [I] [J] = 0 ;
}
}
}
}
Void DFS ( Int X, Int Y, Int Move ){
Int D, NX, NY;
If (Move > = Minmove ){
Return ;
}
For (D = 0 ; D < 4 ; D ++ ){
NX = X;
NY = Y;
While ( 1 ) {// Note
NX + = Dr [d] [ 0 ];
NY + = Dr [d] [ 1 ];
If ( ! Legal (NX, NY) | Map [NX] [NY] = 1 ){
Break ;
}
If (Map [NX] [NY] = 0 && Map [NX + Dr [d] [ 0 ] [NY + Dr [d] [ 1 ] = 1 ){
Map [NX + Dr [d] [ 0 ] [NY + Dr [d] [ 1 ] = 0 ;
DFS (NX, NY, move + 1 );
Map [NX + Dr [d] [ 0 ] [NY + Dr [d] [ 1 ] = 1 ;
Break ;
}
If (Map [NX] [NY] = 3 ){
If (Move < Minmove ){
Minmove = Move;
OK = 1 ;
Break ;
}
}
}
}
}
Int Main (){
Int I, J;
While (Scanf ( " % D " , & W, & H) = 2 , W + H ){
Memset (map, 0 , Sizeof (MAP ));
In ();
OK = 0 ;
Minmove = 11 ;
DFS (startx, starty, 1 );
If (OK)
Printf ( " % D \ n " , Minmove );
Else
Printf ( " -1 \ n " );
}
Return 0 ;
}