#include<stdio.h>
#include<limits.h>
#include<stdbool.h>

#define INF INT_MAX
int minDistance(int dist[],bool visited[],int n){
    int min=INF,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 graph[100][100],int n,int src){
    int dist[100];
    bool visited[100];
    
    for(int i=0;i<n;i++){
        dist[i]=INF;
        visited[i]=false;
    }
    dist[src]=0;
    for(int count=0;count<n-1;count++){
        int u=minDistance(dist,visited,n);
        if(u==-1)
        break;
        visited[u]=true;
        
        for(int v=0;v<n;v++){
            if(!visited[v]&&graph[u][v]&&dist[u]!=INF&&dist[u]+graph[u][v]<dist[v]){
                dist[v]=dist[u]+graph[u][v];
            }
        }
    }
    for(int i=0;i<n;i++){
        if(dist[i]==INF)
          printf("INF");
        else
          printf("%d",dist[i]);
    }
}
int main(){
    int n;
    scanf("%d",&n);
    if(n<0){
        printf("Invalid input");
        return 0;
    }
    int graph[100][100];
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&graph[i][j]);
        }
    }
    int src;
    scanf("%d",&src);
    if(src<0||src>=n){
        printf("Invalid input");
        return 0;
    }
    dijikstra()
}