# ?????????????????????????????????????§???????????????????????????????
# @param [Array]   g Edge ?????????????????§??¨???????????°??????
# @param [Integer] s ????§????????????????
# @return [Array]  ?????????????????§???????¨?????????????????´????????????????
# g ??????????????????????????§?????????
# g_i ?????? i ???????????????????????????????????¨??????????????????????????¨??????????´?????????????
# TODO: ????????????????????\??????????????????????£?????????????
def dijkstra(g, s)
  que = []
  d = Array.new(g.size) { Float::INFINITY }
  d[s] = 0
  que.push [0, s]

  until que.empty?
    v_cost, v = que.sort!.shift
    next if d[v] < v_cost
    g[v].each do |e|
      if d[e.to] > d[v] + e.cost
        d[e.to] = d[v] + e.cost
        que.push [d[e.to], e.to]
      end
    end
  end

  d
end

Edge = Struct.new('Edge', :to, :cost)

v, e, r = gets.split.map(&:to_i)
g = Array.new(v) { [] }
e.times do
  s, t, d = gets.split.map(&:to_i)
  g[s] << Edge.new(t, d)
end

dijkstra(g, r).each do |sum|
  puts (sum == Float::INFINITY ? 'INF' : sum)
end