package test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class BaekJoonQ1753 {
private static int INF = Integer.MAX_VALUE >> 2;
static ArrayList<Node> []graph;
static PriorityQueue<Node> qu;
static class Node implements Comparable<Node>{
int node;
int value;
public Node(int node, int value) {
this.node=node;
this.value=value;
}
@Override
public int compareTo(Node n) {
// TODO Auto-generated method stub
return this.value - n.value;
}
}
static int[] dijkstra(int node, int startNode) {
int[] dist = new int[node+1];
Arrays.fill(dist, INF);
dist[startNode] = 0;
qu = new PriorityQueue<>();
qu.add(new Node(startNode, 0));
while(!qu.isEmpty()) {
Node crnt = qu.poll();
if (dist[crnt.node] < crnt.value) continue;
for(Node next:graph[crnt.node]) {
if (dist[crnt.node] + next.value < dist[next.node]) {
dist[next.node] = dist[crnt.node] + next.value;
qu.add(new Node(next.node, dist[next.node]));
}
}
}
return dist;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st =new StringTokenizer(br.readLine());
int node = Integer.parseInt(st.nextToken());
int edge = Integer.parseInt(st.nextToken());
int startNode =Integer.parseInt(br.readLine());
graph = new ArrayList[node+1];
for(int i =1;i<graph.length;i++) {
graph[i] = new ArrayList<>();
}
for(int i=0;i<edge;i++) {
st =new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b =Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
graph[a].add(new Node(b,v));
}
int[] dist = dijkstra(node, startNode);
for (int i = 1; i <= node; i++) {
if (dist[i] == INF)
bw.write("INF");
else
bw.write(Integer.toString(dist[i]));
bw.newLine();
}
bw.flush();
}
}