#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
	const int inf=4000; // задаем бесконечность 
	int n, start_position, x; // n-количество вершин, вешина от которой мы будем идти, х испозуем для приема матриы смежности 
	cin>>n>>start_position;
	start_position--; //так как в условии счет начинается с единиццы, а в программе с нуля 
	vector <int> verges [1001]; //задаем массив вектоов где i-ый вектор содерит в себе номера вешин в которые можно попасть с i-ой вершины
	for (int i=0; i<n; i++)//заполняем вышеуказанный массив векторов 
	{
		for(int j=0; j<n; j++)
		{
			cin>>x;
			if (x==1)
			{
				verges[i].push_back(j);
			}
		}
	}
	bool *used = new bool [n]; // показывается, применяли ли мы алкоритм для i-ой вершины
	for (int i=0; i<n; i++)
	{
		used[i]=false;
	}
	int *distances = new int [n]; //задаем массив расстояний где i-ый элемент это расстояние от исходной вершины до  i-ой
	for (int i=0; i<n; i++)
	{
		distances[i]=inf; 
	}
	distances[start_position] = 0;
	for (int i=0; i<n; i++) //ищем минимальный элемент для которого еще не применяди алгоритм 
	{
		int minimum=inf;
		int position = 0;
		for (int j=0; j<n; j++)
		{
			if (distances[j]<minimum && !used[j])
			{
				minimum=distances[j];
				position=j;
			}
		}
		used[position]=true; //запоминаем, что для минимального элемента пименили алгоритм 
		for (int i=0; i<verges[position].size(); i++) // применяем алгоитм Дейксты 
		{
			distances[verges[position][i]] = min(distances[verges[position][i]], (distances[position]+1));
		}
	}
	for (int i=0; i<n; i++) 
	{
		cout<<((distances[i]==inf)?-1:distances[i])<<" ";
	}
	return 0;
}