import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static class Node{
public Node(int v,int w) {
this.v=v;
this.w=w;
}
int v;
int w;
}
static class R{
public R(int vertex) {
this.vertex=vertex;
this.distance=Integer.MAX_VALUE;
}
int vertex;
int distance;
int number;
int people;
}
static Comparator<R> com=new Comparator<R>() {
@Override
public int compare(R o1, R o2) {
return o1.distance-o2.distance;
}
};
static Scanner scn=new Scanner(System.in);
static int vertex=scn.nextInt(),start=scn.nextInt();
static List<List<Node>> G=new ArrayList<>();
static boolean[] visit=new boolean[vertex];
static R[] form=new R[vertex];
static Queue<R> pri=new PriorityQueue<>(com);
public static void main(String[] args) {
// 初始化
for(int i=0;i<vertex;i++) {
G.add(new ArrayList<>());
form[i]=new R(i);
}
// 创建图
for(int i=0;i<vertex;i++) {
for(int j=0;j<vertex;j++) {
int w=scn.nextInt();
G.get(i).add(new Node(j, w));
}
}
dijstra(start);
for(int i=0;i<vertex;i++) {
if(i!=start) {
if(form[i].distance!=Integer.MAX_VALUE) {
System.out.print(form[i].distance+" ");
}else {
System.out.print("-1 ");
}
}
}
System.out.println();
}
static void dijstra(int start) {
form[start].distance=0;
pri.offer(form[start]);
for(int i=0;i<vertex;i++) {
int u=pri.poll().vertex;
visit[u]=true;
for(int j=0;j<G.get(u).size();j++) {
int v=G.get(u).get(j).v;
int w=G.get(u).get(j).w;
if(G.get(u).get(j).w!=0 &&!visit[v] && form[u].distance+w<form[v].distance) {
form[v].distance=form[u].distance+w;
form[v].number=form[u].number;
pri.offer(form[v]);
}
}
}
}
}
/**************************************************************
Problem: 2165
User: admin
Language: Java
Result: Accepted
Time:955 ms
Memory:46632 kb
****************************************************************/