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