#include <iostream>
#include <queue>
using namespace std;
int main() {
    // чтение исходных данных
    int n, v;
    cin >> n >> v;
    int M[n][n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) cin >> M[i][j];
        M[i][i] = -1;
    }
    queue <int> plan; // план посещения в виде очереди
    plan.push(--v);   // мы нумеруем с 0, а не с 1
    M[v][v] = 0;      // отмечаем, что эта вершина уже заносилась в план 
    while (!plan.empty()) {
        v = plan.front(); // посещаем следующую по плану вершину 
        plan.pop();       // удаляем ее из плана посещения
        for (int u = 0; u < n; u++) // перебираем соседние с ней
            if (M[v][u] == 1 and M[u][u] == -1) { // если новая, то
                plan.push(u);          // добавляем ее в план
                M[u][u] = M[v][v] + 1; // путь на 1 шаг длиннее
            }
    }
    for (int u = 0; u < n; u++) cout << M[u][u] << " "; 
}