import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static List<List<Integer>> graph; // 存放的是每个公交车经过的站台列表
static List<List<Integer>> zhanTai; // 存放的是每个站台有哪些公交车经过
static boolean[] visited; // 用于标记每个站台是否访问过
static boolean[] used; // 用于标记每个公交车是否使用过
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int n = sc.nextInt();
int m = sc.nextInt();
graph = new ArrayList<>();
zhanTai = new ArrayList<>();
visited = new boolean[n + 1];
used = new boolean[m + 1];
for (int i = 0; i <= m; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i <= n; i++) {
zhanTai.add(new ArrayList<>());
}
for (int i = 1; i <= m; i++) {
int k = sc.nextInt();
for (int j = 0; j < k; j++) {
graph.get(i).add(sc.nextInt());
}
}
// System.out.println(graph);
for (int i = 0; i < graph.size(); i++) {
if (!graph.get(i).isEmpty()) {
for (Integer integer : graph.get(i)) {
zhanTai.get(integer).add(i);
}
}
}
// System.out.println(zhanTai);
//存放每个站台的公交车
ArrayDeque<int[]> queue = new ArrayDeque<>();
//这个是站台1的公交车
for (Integer bus : zhanTai.get(1)) {
queue.add(new int[] {1, bus});
}
int cost = 0;
while (!queue.isEmpty()) {
int size = queue.size();
cost++;
while (size-- > 0) {
int[] temp = queue.poll();
int busTai = temp[0];//拿到当前站台
int bus = temp[1];//拿到当前站台对应公交车
if (used[bus]) continue;
used[bus] = true;//记录公交车已坐过
List<Integer> zhanTaiS = graph.get(bus);//拿到这个公交车经过的站台
for (Integer tai : zhanTaiS) {
if (tai == n) {//如果能到达就直接返回
System.out.println(cost);
return;
}
}
visited[busTai] = true; // 标记当前站台为已访问
// 对于该公交车经过的每个站台,获取该站台的所有公交车并加入队列
for (Integer tai : zhanTaiS) {
if (!visited[tai]) { // 如果该站台未被访问过
for (Integer car : zhanTai.get(tai)) {
queue.add(new int[] {tai, car}); // 将新的{站台, 公交车}加入队列
}
}
}
}
}
System.out.println(-1);
}
}
}