# 다익스트라 = 한지점
# 준비물 " n,m,start,graph,distance , graph[a].append((b,c))


# 1번째 줄 : 정점의 개수 V, 간선의 개수 E ==> (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다.
# 2번째 줄 : 시작 정점의 번호 K (1<=K<=V)
# 3번째 줄 ~ (E개의 줄) : 각 간선을 나타내는 세 개의 정수 u,v,w
#           ==> u->v 로 가는 가중치 w, u!=v, w는 10이하의 자연수

#출력
# 첫째 줄부터 V개의 줄에 걸쳐, i번째 줄에 i번 정점으로의 최단 경로의 경로값을 출력한다.
# 시작점 자신은 0으로 출력하고, 경로가 존재하지 않는 경우에는 INF를 출력하면 된다.

import sys
import heapq

input=sys.stdin.readline
INF=int(1e9)

V,E=map(int,input().split())
K=int(input()) # Start

graph=[[] for i in range(E+1)]

#최단거리
distance=[INF]*(V+1)

#간선 정보
for _ in range(E):
    #u->v 비용 w
    u,v,w=map(int,input().split())
    graph[u].append((v,w))

def dijkstra(start):
    q=[]
    heapq.heappush(q,(0,start))
    distance[start]=0

    while q:
        dist,now=heapq.heappop(q)
        if distance[now]<dist:
            continue

        #근처 노드의 거리 지정
        for i in graph[now]:
            cost=dist+i[1]

            if cost<distance[i[0]]:
                distance[i[0]]=cost
                heapq.heappush(q,(cost,i[0]))
dijkstra(K)

for i in range(1,V+1):
    if distance[i]==INF:
        print("INF")
    else:
        print(distance[i])

 
 # why IndexError ? 
