Go: package main

import (
	"fmt"
	"os"
	"bufio"
	"strconv"
	"container/list"
)

const MaxNode int = 100

var d []int
var A [][]int
var N int
var l *list.List

func bfs(u int) {
	d[u] = 0
	l.PushBack(u)
	for ;l.Len() != 0; {
		u = l.Front().Value.(int)
		l.Remove(l.Front())
		for v:=0; v<N; v++ {
			if A[u][v] == 0 {
				continue
			}
			if d[v] != -1 {
				continue
			}
			d[v] = d[u] + 1
			l.PushBack(v)
		}
	}
}


func nextInt(scanner *bufio.Scanner) int {
	scanner.Scan()
	num, _ := strconv.Atoi(scanner.Text())
	return num
}

func print() {
	for i:=0; i<N; i++ {
		fmt.Printf("%d %d\n", i+1, d[i])
	}
}

func initVariable() {
	d = make([]int, MaxNode)
	A = make([][]int, MaxNode)
	l = list.New()
	for i:=0; i<MaxNode; i++ {
		A[i] = make([]int, MaxNode)
		d[i] = -1
	}
}


func main() {
	initVariable()
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	N = nextInt(scanner)
	for i:=0; i<N; i++ {
		idx := nextInt(scanner)
		cnt := nextInt(scanner)
		for j:=0; j<cnt; j++ {
			node := nextInt(scanner)
			A[idx-1][node-1] = 1 
		}
	}
	bfs(0)
	print()
}

C++: #include<bits/stdc++.h>
using namespace std;

const int INF=99999999;

void get_dinetwork(int N,vector<vector<int>>& array){
    int u,k,x;

    for(int i=0;i<N;i++){
        cin>>u>>k;
        for(int j=0;j<k;j++){
            cin>>x;
            array[u-1][x-1]=1;
        }
    }

}

int bfs(int n,vector<vector<int>>& A,int v,vector<int>& d,vector<int>& flag){
        d[v]=0;
        flag[v]=1;
        queue<int> Q;
        for(int i=0;i<n;i++){if(A[v][i]==1){Q.push(i);}}
        int dmin;
        while(!Q.empty()){
                dmin=INF;
                for(int i=0;i<n;i++){if(A[i][Q.front()]==1 && d[i]<dmin){dmin=d[i];}}
                d[Q.front()]=dmin+1;
                flag[Q.front()]=1;
                for(int i=0;i<n;i++){if(A[Q.front()][i]==1 && flag[i]!=1){Q.push(i);}}
                Q.pop();
        }
}

int main(){
        cin.tie(0);
        ios::sync_with_stdio(false);

        int n;
        cin>>n;
        vector<vector<int>> array(n,vector<int>(n,0));
        get_dinetwork(n,array);

        //
        vector<int> d(n,INF);
        vector<int> flag(n,-1);
        //
        bfs(n,array,0,d,flag);
        //

        for(int i=0;i<n;i++){
                if(d[i]==INF){d[i]=-1;}
                cout<<i+1<<" "<<d[i]<<"\n";
        }

        return 0;

}

C++: #include <bits/stdc++.h>
using namespace std;

int N=100;
int INF = 1234567890;
int n,M[100][100];
int d[100];
void bfs(int s){
  queue<int> q;
  q.push(s);
  for(int i=0;i<n;i++) d[i] = INF;
  d[s]=0;
  int u;
  while(!q.empty()){
    u = q.front();
    q.pop();
    for(int v=0;v<n;v++){
      if(M[u][v]==0) continue;
      if(d[v]!=INF) continue;
      d[v]=d[u]+1;
      q.push(v);
    }
  }
  for(int i=0;i<n;i++){
    if(d[i]==INF) cout<<i+1<<" "<<-1<<endl;
    else cout<<i+1<<" "<<d[i]<<endl;
  }
}

int main() {
int u,k,v;
cin>>n;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) M[i][j]=0;

for(int i=0;i<n;i++) {
  cin>>u>>k;
  u--;
  for(int j=0;j<k;j++){
  cin>>v;
  v--;
  M[u][v]=1;
  }
}
  bfs(0);

}