#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<iostream>
#include<cmath>

using namespace std;
typedef vector<string>vs;
typedef vector<int>vi;
typedef vector<vi>vvi;
typedef vector<double>vd;
typedef pair<int,int>pii;
typedef long long ll;
typedef pair<ll,ll>pll;
typedef vector<ll>vl;
#define rrep(i,x,n) for(int i=(x);i<(n);++i)
#define rep(i,x) rrep(i,0,(x))
#define fi first
#define se second
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();++i)
#define all(c) (c).begin(),(c).end()
#define rall(c) (c).rbegin(),(c).rend()
#define pb push_back
#define maxs(a,b) (a)=max(a,b)
#define mins(a,b) (a)=min(a,b)

struct data{
    int p,h,cost;
    data(int a,int b,int c):
        p(a),h(b),cost(c){}
    data(){}
};

int n;
int state[2][100];

void solve(){
    bool visited[2][100]={{0}};
    queue<data>Q;
    Q.push(data(0,0,0));
    Q.push(data(1,0,0));
    while(!Q.empty()){
        data d=Q.front();Q.pop();
        while(d.h<n&&state[d.p][d.h]==1){
            int th=d.h+1;
            if(th>=n)break;
            if(state[d.p][th]!=1)break;
            d.h++;
        }
        while(state[d.p][d.h]==2)d.h--;



        if(d.h==n-1){
            printf("%d\n",d.cost);

            return;
        }

        if(visited[d.p][d.h])continue;
        visited[d.p][d.h]=true;
        rep(i,3){
            int tp=1-d.p,th=min(d.h+i,n-1);
            Q.push(data(tp,th,d.cost+1));
        }

    }

    puts("NA");
}

int main(){
    while(scanf("%d",&n),n){
        rep(i,2)rep(j,n)scanf("%d",&state[i][j]);
        solve();
    }
    return 0;
}