#include <stdio.h>

#define MAX 100
#define INF 1000000

int main (){
    int n;
    if(scanf("%d", &n) != 1 || n<=0 || n> MAX){
        printf("Invalid input");
        return 0;
        
    }
    int graph [MAX][MAX];
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(scanf("%d", &graph[i][j])!= 1){
                printf("Invalid input");
                return 0;
            }
        }
    }
    int src;
    if(scanf("%d", &src)!= 1 || src< 0|| src>= n){
        printf("Invalid input");
        return 0;
    }
    
    int dist[MAX], visited[MAX];
    for(i=0;i< n; i++){
        dist[i] = INF;
     visited[i]= 0;
    }
    dist[src] = 0;
    for(int count=0; count< n-1; count++){
        int min = INF , u= -1;
        for(int v=0; v< n; v++){
            if(!visited[v] && dist[v] <= min){
                min = dist[v];SS
                u = v;
            }
        }
        if(u== -1)
        break;
        
        visited[u] = 1;
        
        for(int v=0;v< n; v++){
            if(!visited[v] && graph[u][v] > 0 && dist[u] + graph[u][v] < dist[v])
 {           
            dist[v] = dist[u] + graph[u][v];
        }
    }
}
    for(i=0;i <n; i++){
        printf("%d", dist[i]);
        if(i < n -1)
        printf(" ");
    }
    return 0;
}