#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <limits.h>    
#define inf 100000000
#define INF 9223372036854775807
#define EPS 1e-10
#define sq(n) ((n)*(n))
#define rep(i,n) for(i=0;i<n;i++)
#define rev(i,n) for(i=n-1;i>=0;i--)
#define sort(a,n) qsort(a,n,sizeof(TYPE),cmp)
#define sort_r(a,n) qsort(a,n,sizeof(TYPE),cmp_r);
#define chsort(s,n) qsort(s,n,sizeof(char),cmp)
#define chsort_r(s,n) qsort(s,n,sizeof(char),char_cmp_r);
#define TYPE long long
#define MEMSET(a) memset(a,0,sizeof(a))
long long mod=(long long)1e09+7;

int in(void){
    int i;scanf("%d",&i);
    return i;
}
long long llin(void){
    long long i;scanf("%lld",&i);
    return i;
}
double din(void){
    double i;scanf("%lf",&i);
    return i;
}
void chin(char s[]){
    scanf("%s",s);
}
void print(int a){
    printf("%d\n",a);
}
void llprint(long long a){
    printf("%lld\n",a);
}
void dprint(double a){
    printf("%.10f\n",a);
}
void print2(int a,int b){
    printf("%d %d\n",a,b);
}
long long max(long long a,long long b){
    return a>b?a:b;
}
long long min(long long a,long long b){
    return a<b?a:b;
}
int cmp(const void *a,const void *b){
    return *(TYPE *)a-*(TYPE *)b;
}
int cmp_r(const void *a,const void *b){
    return *(TYPE *)b-*(TYPE *)a;
}
int char_cmp(const void *a,const void *b){
    return strcmp((char *)a,(char *)b);
}
int char_cmp_r(const void *a,const void *b){
    return strcmp((char *)b,(char *)a);
}
void swap(int *a,int *b){
    int t=*a;
    *a=*b;
    *b=t;
}
long long gcd(long long x,long long y){
    return x%y?gcd(y,x%y):y;
}
long long lcm(long long x,long long y){
    return x/gcd(x,y)*y;
}

// write codes below this
// when you use 'sort',
// make sure TYPE macro is correct
typedef struct{
    int x,y;
}queue;
queue q[100000];

int h,w,b[60][30],head,teil,f[30][30];

void foo(int tx,int ty){
    int i,dx[]={1,-1,0,0},dy[]={0,0,-1,1},nx,ny;
    int kx[]={tx,tx-1,tx,tx},ky[]={2*ty,2*ty,2*ty-1,2*ty+1};
    rep(i,4){
        if(b[ky[i]][kx[i]])continue;
        nx=tx+dx[i];
        ny=ty+dy[i];
        if(0<=ny&&ny<h&&0<=nx&&nx<w){
            if(f[ny][nx]==-1||f[ny][nx]>f[ty][tx]+1){
                f[ny][nx]=f[ty][tx]+1;
                teil++;
                q[teil].x=nx;
                q[teil].y=ny;
            }
        }
    }
}

int main(void){
    int i,j,sx,sy,gx,gy,tx,ty;
    while(w=in()){
        h=in();
        getchar();
        rep(i,2*h-1){
            if(i%2){
                rep(j,w)b[i][j]=in();
            }
            else{
                rep(j,w-1)b[i][j]=in();
            }
        }
        MEMSET(q);
        head=teil=0;
        memset(f,-1,sizeof(f));
        f[0][0]=1;
        sx=sy=0;
        gx=w-1;
        gy=h-1;
        q[head].x=sx;
        q[head].y=sy;
        while(head<=teil){
            tx=q[head].x;
            ty=q[head].y;
            head++;
            foo(tx,ty);
        }
        print(f[gy][gx]!=-1?f[gy][gx]:0);
    }
    return 0;
}
