#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int step[109][109];
struct node
{
int x,y,way,run;
};
queue<node> q;
bool vis[109][109][109];
int main()
{
int n,m;
cin>>m>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>step[i][j];
}
memset(vis,1,sizeof(vis));
node u;
u.x=1,u.y=1,u.way=9,u.run=0;
q.push(u);
while(!q.empty())
{
node p;
p=q.front();
q.pop();
int xx=p.x;
int yy=p.y;
int wayy=p.way;
int runn=p.run;
if(xx==n&&yy==m)
{
cout<<runn;
exit(0);
}
if(wayy!=1)
{
int go=step[xx][yy];
if(xx+go>=1&&xx+go<=n&&yy>=1&&yy<=m&&vis[xx+go][yy][wayy]==1)
{
vis[xx+go][yy][wayy]=0;
u.x=xx+go,u.y=yy,u.way=1,u.run=runn+1;
q.push(u);
}
}
if(wayy!=2)
{
int go=step[xx][yy];
if(xx-go>=1&&xx-go<=n&&yy>=1&&yy<=m&&vis[xx-go][yy][wayy]==1)
{
vis[xx-go][yy][wayy]=0;
u.x=xx-go,u.y=yy,u.way=2,u.run=runn+1;
q.push(u);
}
}
if(wayy!=3)
{
int go=step[xx][yy];
if(xx>=1&&xx<=n&&yy+go>=1&&yy+go<=m&&vis[xx][yy+go][wayy]==1)
{
vis[xx][yy+go][wayy]=0;
u.x=xx,u.y=yy+go,u.way=3,u.run=runn+1;
q.push(u);
}
}
if(wayy!=4)
{
int go=step[xx][yy];
if(xx>=1&&xx<=n&&yy-go>=1&&yy-go<=m&&vis[xx][yy-go][wayy]==1)
{
vis[xx][yy-go][wayy]=0;
u.x=xx,u.y=yy-go,u.way=4,u.run=runn+1;
q.push(u);
}
}
if(wayy!=5)
{
int go=step[xx][yy];
if(xx-go>=1&&xx-go<=n&&yy-go>=1&&yy-go<=m&&vis[xx-go][yy-go][wayy]==1)
{
vis[xx-go][yy-go][wayy]=0;
u.x=xx-go,u.y=yy-go,u.way=5,u.run=runn+1;
q.push(u);
}
}
if(wayy!=6)
{
int go=step[xx][yy];
if(xx-go>=1&&xx-go<=n&&yy+go>=1&&yy+go<=m&&vis[xx-go][yy+go][wayy]==1)
{
vis[xx-go][yy+go][wayy]=0;
u.x=xx-go,u.y=yy+go,u.way=6,u.run=runn+1;
q.push(u);
}
}
if(wayy!=7)
{
int go=step[xx][yy];
if(xx+go>=1&&xx+go<=n&&yy-go>=1&&yy-go<=m&&vis[xx+go][yy-go][wayy]==1)
{
vis[xx+go][yy-go][wayy]=0;
u.x=xx+go,u.y=yy-go,u.way=7,u.run=runn+1;
q.push(u);
}
}
if(wayy!=8)
{
int go=step[xx][yy];
if(xx+go>=1&&xx+go<=n&&yy+go>=1&&yy+go<=m&&vis[xx+go][yy+go][wayy]==1)
{
vis[xx+go][yy+go][wayy]=0;
u.x=xx+go,u.y=yy+go,u.way=8,u.run=runn+1;
q.push(u);
}
}
}
cout<<"NEVER";
return 0;
}