#define _CRT_SECURE_NO_WARNINGS
// #define _USE_MATH_DEFINES
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstdlib>
#include <functional>
#include <locale>
#include <cctype>
#include <sstream>
#include <iomanip>	// 10????????? cout << setprecision(10) << double;
#include <queue>
using namespace std;

typedef long long LL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef map<int, int> MAPII;
typedef multimap<int, char, greater<int> > MuMAPIC;
typedef vector<pair<int, int> > VPII;
typedef multimap<int, string, greater<int> > MuMIS;
typedef pair<int, int> P;
typedef pair<int, pair<P, P> > PP;

#define MP make_pair
#define FAST_IO  cin.tie(0); ios::sync_with_stdio(false);
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
//for gcc (???test)
// #define FOREACH_IT(it,c) for(typeof(c)::iterator it=(c).begin(); it!=(c).end(); ++it)
//for Visual Studio
#define foreach_it(type,it,c) for(type::iterator it=c.begin(),c_end=c.end();it!=c_end;++it)
// for Debug.
#define DUMP_VVI(b) FOR(i,0,b.size()){FOR(j,0,b[i].size())printf("%d ",b[i][j]);puts("");}
#define D_OUT(str,value) if(dbgF){cout<<str<<" : "<<value<<endl;}
// ??\??????push_back(d)???array[d]???????????????1?????§?????????
// int INPUT_INT() {int d;cin>>d;return d;}
template<class T>T IN() { T d; cin >> d; return d; }
// ?????§??¬?´???°???Greatest Common Divisor???
LL gcd(LL a, LL b) { return (b > 0) ? gcd(b, a%b) : a; }
// ????°???¬?????°???Least Common Multiple???
LL lcm(LL a, LL b) { return a / gcd(a, b) * b; }
// Y??´??????????????´?????????
bool uruu(LL Y) { return (((Y % 4 == 0 && Y % 100 != 0) || Y % 400 == 0) ? true : false); }

// vector??¨???
// vec[i][j]?????¢?????\????????\????????¨??????vec???????????????????????????????????????.

#define INF 1000000

// ------------------- include, typedef, define END. -------------------

int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
VVI ans;
int w, h;
/*

2 3
 1
0 1
 0
1 0
 1
9 4
 1 0 1 0 0 0 0 0
0 1 1 0 1 1 0 0 0
 1 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1
 0 0 0 1 0 0 1 1
0 0 0 0 1 1 0 0 0
 0 0 0 0 0 0 1 0
12 5
 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0
 1 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 0 0
 0 0 1 0 0 1 0 1 0 0 0
0 0 0 1 1 0 1 1 0 1 1 0
 0 0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 1 0 0
0 0

*/


void BFS(VVI maze) {
	queue<P> q;
	FOR(i, 0, ans.size()) {
		FOR(j, 0, ans[i].size()) {
			ans[i][j] = INF;
		}
	}

	q.push(MP(0, 0));
	ans[0][0] = 1;

	while (!q.empty()) {
		P nowPlace = q.front(); q.pop();
		int nowAns = ans[nowPlace.first][nowPlace.second];

		FOR(i, 0, 4) {
			int nextPlaceKABE_hei = nowPlace.first + dy[i];
			int nextPlaceKABE_wid = nowPlace.second + dx[i];
			//cout << "????£???°???(" << nextPlaceKABE_hei << " , " << nextPlaceKABE_wid << ")" << endl;

			if (nextPlaceKABE_hei >= 0 && nextPlaceKABE_wid >= 0 &&
				nextPlaceKABE_hei<h * 2 - 1 && nextPlaceKABE_wid<2*w-1
				&& maze[nextPlaceKABE_hei][nextPlaceKABE_wid] == 0) {
				int nowPlace_hei = nextPlaceKABE_hei + dy[i];
				int nowPlace_wid = nextPlaceKABE_wid + dx[i];
				//cout << "????????¨??°???(" << nowPlace_hei << " , " << nowPlace_wid << ")" << endl;

				// ??´??°?????´???
				if (ans[nowPlace_hei][nowPlace_wid] > nowAns + 1) {
					ans[nowPlace_hei][nowPlace_wid] = nowAns + 1;
					q.push(MP(nowPlace_hei, nowPlace_wid));
				}

			}
		}


	}
	//cout << "BFS end" << endl;



}

int main() {
	FAST_IO;
	// for D_OUT(str, value)  ... cout<< str <<" : "<< value <<endl;
	bool dbgF = true;

	//??????????????????????????????.



	while (cin >> w >> h, w || h) {

		// maze??????
		VVI maze(h * 2 - 1, VI(2*w-1, 0));
		ans = maze;
		//cout << "W=" << w << " h=" << h << endl;
		string temp;
		getline(cin, temp);


		FOR(i, 0, h * 2-1) {
			string s;
			getline(cin, s);
			int forLen = 0;
			if (i == 0 || i % 2 == 0) {
				s += ' ';
			}
			//cout << "S = " << s << endl;

			FOR(j, 0, 2 * w - 1) {
				if (s[j] == ' ') {
					maze[i][j] = 0;
				}else{
					maze[i][j] = s[j]-'0';
				}
			}

		}

		//cout << "-start-" << endl;
		//DUMP_VVI(maze);

		BFS(maze);

		//DUMP_VVI(ans);

		if (ans[h * 2 - 2][2*w-2] == INF) {
			cout << 0 << endl;
		}
		else {
			cout << ans[h * 2 - 2][2*w-2] << endl;
		}
	}



	return 0;
}

Measured memory_bytes: 1292