#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>

#define skipnotdigit(n)   while( 0 == isdigit(*n)) (n)++
#define skipdigit(n)      while( isdigit(*n)) (n)++
#define push(a, b)        {*a = b; a++;} while (0)
#define pop(a, b)         {a--; b = *a;} while (0)


int main(void)
{
  char input[10000] = {0}; 
  {
    unsigned int i = 0;
    int c;
    while
    (
     ((c = getchar()) != EOF) &&
     (i < sizeof(input)) // Чтобы буфер не переполнили мне тут
    )
    {
      fprintf(stderr,"!%c!", c);
      input[i]=c;
      i++;
    }
    fprintf(stderr,"!%c!", c);
  }

  //read(STDIN_FILENO, input, sizeof(input[0])*sizeof(input)); 

  unsigned int a;
//  int asd;
  if (sscanf(input, "%u", &a) != 1) // чтение количества вершин в графе
  {
  	return EXIT_FAILURE;
  }
  unsigned int n1;
  void *memmalloc =  malloc(sizeof(unsigned int) * (a * (a + 1) + a + 2 * a));
  //Память для матрицы, расстояний от нулевой вершины и двух стеков.
  if (memmalloc == NULL)
  {
    perror("malloc failed");
    return EXIT_FAILURE;
  }
  unsigned int *matrix = memmalloc;
  unsigned int * mt_p;
  //матрица, которая будет содержать в себе граф
  //и указатель, который будет по матрице бегать

  memset(matrix, 0x00, sizeof(unsigned int)* a * (a + 1));
  //malloc не инициализирует память, поэтому надо записать сюда нули

  char * inp_p = &input[0]; //указатель на входные данные

  //char buffer[8] = {};
  char buffer[9] = {0};
  // временный буфер, который чтобы числа в него читать
  // и чтобы потом через atoi преобразовывать в число

  char * buf_p = buffer;


  skipnotdigit(inp_p);     //Этот кусок кода нужен для того,
  skipdigit(inp_p);        //чтобы пропустить первое число,
                           //задающее количество вершин графа
  
  for(n1 = 0; n1 < a; n1++)
  {
    skipnotdigit(inp_p);
  
    mt_p = matrix + n1 * (a+1);
    do
    {
      do
      {
        *buf_p = *inp_p;  // копирование аскии-кодов циферок в буфер
        buf_p++; inp_p++; // Увеличим и то и другое
      }
      while(isdigit(*inp_p));
  
  
      *mt_p = atoi(buffer);
      buf_p  = buffer;
      memset(buffer, 0x00, sizeof(buffer) * sizeof(buffer[0]));
  
      if (*mt_p == 0)  // Обработка нуля.
      {
        break;      // Если ноль, заполнять вторую строчку
      }
      mt_p++; // Иначе Заполняем следующий элемент в матрице
    } while (1);
  
  }
  
  
  unsigned int *dist = &matrix[a * (a + 1)];
  //Массив с расстояниями до нулевой вершины. Расположен после двумерной матрицы.
  
  memset(dist, 0xFF, sizeof(*dist) * a);
  dist[0]= 0;
  
  unsigned int *stack[2];
  stack[0] = &dist[1 * a]; //Первый стек идет после массива с расстояниями
  stack[1] = &dist[2 * a]; //Второй стек идет после первого стека
  
  stack[0][0] = 0;
  stack[0][1] = 0;
  
  unsigned int *stackp[2];
  stackp[0] = stack[0];
  stackp[1] = stack[1];

  
  mt_p = matrix;
  
  unsigned int steps=0;
  
  unsigned char one_zero = 0;
  
  push(stackp[one_zero], 0);
  //нужно обработать то, что связано с самой первой вершиной, которая у нас нулевая


  do
  {
    steps++;
    do
    {
      pop(stackp[one_zero], n1);
      //n1 - номер вершины. Берем из стека

      mt_p = matrix + (a + 1) * n1;
      //ставит указатель на нужную строчку. В строчке список вершин, заканчивающихся нулем
    
      while ( (*mt_p) != 0)
      {  // Пока не появится ноль, означающий что эта вершина больше ни с чем не соединена
        if ( dist[(*mt_p)-1] > steps )
        { // Если до той вершины графа еще не дошагали за меньшее число ходов
          dist[(*mt_p)-1] = steps;
          // Вносим туда наше число шагов
          push(stackp[one_zero^1], (*mt_p)-1); 
          // Вносим номер вершины в стек, чтобы потом посмотреть, с чем соединена та вершина
        }

        mt_p++;
        //смотрим, с какой следующей вершина связана эта вершина (если с никаким, *mt_p будет равен нулю )
      }
    } while ( stackp[one_zero] > stack[one_zero] );
    one_zero ^= 1;
    // Переключалка из нуля в единицу и наоборот

  } while (stackp[one_zero] > stack[one_zero]);


  for (unsigned int i = 0; i != a-1; i++)
  {
    printf("%i ", dist[i]);
  }
  printf("\n");

  free(memmalloc);
  return EXIT_SUCCESS;
}