// editor5
#include <stdio.h>

#define MAX 100
#define INF 999999

int main() {
    int n;
    scanf("%d", &n);

    // Check for invalid number of airports
    if (n < =0) {
        printf("Invalid input");
        return 0;
    }

    int cost[MAX][MAX];
    // Read cost matrix
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (scanf("%d", &cost[i][j]) != 1) {
                printf("Invalid input");
                return 0;
            }
        }
    }

    int start;
    scanf("%d", &start);

    // Dijkstra's algorithm
    int dist[MAX], visited[MAX];

    for (int i = 0; i < n; i++) {
        dist[i] = cost[start][i];
        visited[i] = 0;
    }

    dist[start] = 0;
    visited[start] = 1;

    for (int count = 1; count < n - 1; count++) {
        int min = INF, u = -1;

        // Find the unvisited vertex with the smallest distance
        for (int i = 0; i < n; i++) {
            if (!visited[i] && dist[i] < min) {
                min = dist[i];
                u = i;
            }
        }

        if (u == -1) break;

        visited[u] = 1;

        // Update distances
        for (int v = 0; v < n; v++) {
            if (!visited[v] && cost[u][v] && dist[u] + cost[u][v] < dist[v]) {
                dist[v] = dist[u] + cost[u][v];
            }
        }
    }

    // Print minimum cost to reach each airport
    for (int i = 0; i < n; i++) {
        printf("%d ", dist[i]);
    }

    return 0;
}