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);
        }
    }
}