#include<iostream>
#include<string>
#include<cmath>
using namespace std;
struct Dis{
int value;
bool visit;
Dis(){
value = 0;
visit = false;
}
};
long long intMax = pow(2,31)-1;
void createGraph(int **arc, Dis *dis, const int edge){
int start;
int end;
int weight;
int count = 0;
while(count != edge){
cin >> start >> end >> weight;
arc[start-1][end-1] = weight;
count++;
}
}
void Dijkstra(int **arc, Dis *dis, const int n,const int begin){
for(int i = 0; i< n; i++){
dis[i].value = arc[begin-1][i];
}
dis[begin-1].value = 0;
dis[begin-1].visit = true;
int count = 1;
while(count != n){
int temp = -1;
int min = intMax;
for(int i = 0; i < n; i++){
if(!dis[i].visit&& dis[i].value < min){
min = dis[i].value;
temp = i;
}
}
if(temp == -1) break;
dis[temp].visit = true;
++count;
for(int i = 0; i < n; i++){
if(!dis[i].visit && arc[temp][i]!=intMax && (dis[temp].value+arc[temp][i]) < dis[i].value){
dis[i].value = dis[temp].value + arc[temp][i];
}
}
}
}
int main(){
int n,edge,begin;
cin >> n >> edge >> begin;
int **arc = new int*[n];
for(int i = 0; i < n; i++){
arc[i] = new int[n];
for(int k = 0; k < n; k++){
arc[i][k] = intMax;
}
}
Dis *dis = new Dis[n];
createGraph(arc,dis,edge);
Dijkstra(arc,dis,n,begin);
for(int i = 0; i < n; i++){
cout << dis[i].value << ' ';
}
for(int i = 0; i < n; i++){
delete[] arc[i];
}
delete[] arc;
delete[] dis;
}