#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <math.h>
#include <functional>
#define ull unsigned long long
#define ll long long
#define pii pair<ll ,ll>
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define forn(i,begin,end,add) for(ll (i)=(begin);(i)<=(end);(i)+=(add))
#define rforn(i,begin,end,sub) for(ll (i)=(end);(i)>=(begin);(i)-=(sub))
#define vv vector
#define inf32 INT32_MAX/2
#define inf64 INT64_MAX/2
#define LD double
#define PI acos(-1)
#define debug(a,b) cout<<a<<b
#define eps 1e-12
const int N = 4e5 + 100;
const int mod = 998244353;
ll T;
void solve() {
int n, m, s; cin >> m >> n ;
s = 1;
vv <vv<pair<int,int>>>area(n + 1);
forn(i, 1, m, 1){
vv<int>all;
char ch;
do{
int a; cin >> a;
all.push_back(a);
ch = getchar();
} while (ch != '\n');
forn(i, 0, all.size() - 1, 1)
forn(j, i + 1, all.size() - 1, 1)
area[all[i]].push_back({all[j],1});
}
vv<int>d(n + 1, inf32);
priority_queue<pair<int,int>>q;
vv<int>flag(n + 1);
q.push({ 0,s });
d[s] = 0;
while (q.size()) {
auto nd = q.top().second;
q.pop();
if (flag[nd])
continue;
flag[nd] = 1;
for (auto a : area[nd]) {
if (d[a.first] > d[nd] + a.second){
d[a.first] = d[nd] + a.second;
q.push({ -d[a.first],a.first });
}
}
}
if (d[n] == inf32)
cout << -1 << endl;
else
cout << d[n]-1 << endl;
}
int main() {
T = 1;
while(T--)
solve();
return 0;
}