#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
struct elem{
int catre,cost;
};
int n,m,x,y,z;
vector<elem> v[100001];
int dist_min[100001];
bool operator <(elem a, elem b){
return a.cost>b.cost;
}
priority_queue<elem> q;
void dijkstra(int m){
for(auto u:v[m]){
q.push(u);
///punem nodurile care pleaca de la primul nod
///practic punem inceputurile
}
while(!q.empty()){
elem x=q.top();
q.pop();
if(x.cost<dist_min[x.catre]){
///daca costul cu care am ajuns la nodul curent
///este mai mic decat costul curent al nodului
///il punem, si punem si vecinii lui
dist_min[x.catre]=x.cost;
for(auto u:v[x.catre]){
elem nr;
nr.cost=x.cost+u.cost;
///punem cu costul curent
nr.catre=u.catre;
q.push(nr);
}
}
}
for(int i=1;i<=n;i++){
if(dist_min[i]!=100001){
fout<<dist_min[i];
}
else{
if(i==m){
fout<<0;
}
else{
fout<<-1;
}
}
fout<<" ";
}
}
int main()
{
fin>>n>>m;
while(fin>>x>>y>>z){
elem nr;
nr.catre=y;
nr.cost=z;
v[x].push_back(nr);
}
for(int i=1;i<=n;i++){
if(i!=m){
dist_min[i]=100001;
}
}
dijkstra(m);
return 0;
}