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