// editor1
#include<stdio.h>
#include<limits.h>
#define INF INT_MAX
int mindist(int dist[],int 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 dijkstr(int n,int graph[n][n],int src)
{
    int dist[n],visited[n];
    for(int i=0;i<n;i++)
    {
        dist[i]=INF;
        visited[i]=0;
    }
    dist[src]=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]!=&&dist[u]!=INF&&dist[u]+graph[u][v]<dist[v]){
                 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
    prinf("%d ",dist[i])
    
}
printf("\n");
}
int main(){
    int n;
    scanf("%d",&n);
    if(n<0)
    {
        printf("Invalid input\n");
        return 0;
    }
    int graph[n][n];
    for(int i=0;i<n;i++)
    {chsr row[105];
    scanf("%s",row);
    for(intj=0;j<n;j++)
    {
        graph[i][j]=row[j]-'0';
        
    }
}
int s;
scanf("%d",&s);
if(s<0||s>=n)
{
    printf("Invalid input\n");
    return 0;
    

    
}
dijkstra(n,graph,s);
return 0;
}