#include<bits/stdc++.h>
#define A 1000
#define N 60000+5
using namespace std;
string s;
int m,n,dis1[N];
bool vis[N];
struct node{int to,dis;};
vector<node>g[N];
priority_queue<pair<int,int> >q;
void build(int fl)
{
int i,cnt=0,tmp[505],sum=0;
memset(tmp,0,sizeof(tmp));
for(i=0; i<s.size(); i++)
{
if(isdigit(s[i]))
sum=(sum<<1)+(sum<<3)+s[i]-'0';
else if(sum)tmp[++cnt]=sum,sum=0;
}
tmp[++cnt]=sum;
for(i=1; i<cnt; i++)
{
g[tmp[i]+fl*A].push_back((node){tmp[i+1]+fl*A,0});
}
}
void dij()
{
int i,fr;
memset(dis1,127,sizeof(dis1));
for(int k=0; k<=m; k++)
{
dis1[1+A*k]=0;
q.push(make_pair(0,1+A*k));
}
while(!q.empty())
{
fr=q.top().second;
q.pop();
if(vis[fr])continue;
vis[fr]=1;
for(i=0; i<g[fr].size(); i++)
{
int t=g[fr][i].to,ds=g[fr][i].dis;
if(dis1[fr]+ds<dis1[t])
{
dis1[t]=dis1[fr]+ds;
q.push(make_pair(-dis1[t],t));
}
}
}
}
int main()
{
int i,k;
scanf("%d%d",&m,&n);
m--;getline(cin,s);
for(k=0; k<=m; k++)
{
getline(cin,s);
build(k);
}
for(k=0; k<m; k++)
for(i=1; i<=n; i++)
g[i+A*k].push_back((node){i+A*k+A,1}),
g[i+A*k+A].push_back((node){i+A*k,1});
dij(); int ans=2e9;
for(k=0; k<=m; k++)
{
ans=min(ans,dis1[A*k+n]);
}
if(ans==2e9)printf("NO");
else printf("%d",ans);
}