//#include <bits/stdc++.h>

#include <iostream>
#include <algorithm>

#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <utility>
#include <array>
#include <complex>
#include <valarray>

#include <cassert>
#include <cmath>
#include <functional>
#include <iomanip>
#include <chrono>
#include <random>
#include <numeric>


using namespace std;
#define int long long

typedef long long ll;
typedef unsigned long long ull;
//typedef unsigned __int128 HASH;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pullull;
typedef pair<ll,int> plli;
typedef pair<double, int> pdbi;
typedef pair<int,pii> pipii;
typedef pair<ll,pll> plpll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<pii> vpii;
typedef vector<vector<int>> mat;

#define rep(i,n) for (int i=0;i<(n);i++)
#define rep2(i,a,b) for (int i=(a);i<(b);i++)
#define rrep(i,n) for (int i=(n);i>0;i--)
#define rrep2(i,a,b) for (int i=(a);i>b;i--)
#define pb push_back
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define rall(a) (a).rbegin(),(a).rend()

const ll hmod1 = 999999937;
const ll hmod2 = 1000000000 + 9;
const int INF = 1<<30;
const ll mod = 1000000000 + 7;
const int dx4[4] = {1, 0, -1, 0};
const int dy4[4] = {0, 1, 0, -1};
const int dx8[8] = {1, 1, 1, 0, 0, -1, -1, -1};
const int dy8[8] = {0, 1, -1, 1, -1, 0, 1, -1};
const double pi = 3.141592653589793;

#define addm(X, Y) (X) = ((X) + ((Y) % mod) + mod) % mod
#define inside(y, x, h, w) (0 <= (y) && (y) < (h) && 0 <= (x) && (x) <= (w)) ? true : false

int w, h;

signed main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    while (true) {
        cin >> w >> h;
        if (w == 0) break;
        int g[2 * h + 1][2 * w + 1] = {};
        rep(i, 2 * h + 1) {
            if (i % 2 == 1) {
                g[i][0] = 1;
                g[i][2 * w] = 1;
            }
        }
        rep(j, 2 * w + 1) {
            g[0][j] = 1;
            g[2 * h][j] = 1;
        }
        rep2(i, 1, 2 * h) {
            if (i % 2 == 1) {
                for (int j = 2; j < 2 * w; j+= 2) {
                    cin >> g[i][j];
                }
            }
            else {
                for (int j = 1; j < 2 * w; j += 2) {
                    cin >> g[i][j];
                }
            }
        }
        queue<pair<int, int>> q;
        q.push({1, 1});
        int dist[2 * h + 1][2 * w + 1] = {};
        bool visited[2 * h + 1][2 * w + 1] = {};
        visited[1][1] = true;
        while (!q.empty()) {
            pair<int, int> p = q.front(); q.pop();
            rep(i, 4) {
                int ny = p.fi + dy4[i];
                int nx = p.se + dx4[i];
                int ny2 = p.fi + dy4[i] * 2;
                int nx2 = p.se + dx4[i] * 2;
                if (!inside(ny, nx, 2 * h + 1, 2 * w + 1)) continue;
                if (g[ny][nx] == 0 && !visited[ny][nx] && !visited[ny2][nx2]) {
                    visited[ny][nx] = true;
                    visited[ny2][nx2] = true;
                    dist[ny2][nx2] = dist[p.fi][p.se] + 1;
                    q.push({ny2, nx2});
                }
            }
        }
        if (dist[2 * h - 1][2 * w - 1] == 0) cout << 0 << endl;
        else cout << dist[2 * h - 1][2 * w - 1] + 1 << endl;

    }
}

Measured memory_bytes: 3168