# include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int n,m,s,t;
int tot = 0;
struct edge{
int to,next,w;
}e[maxn];
int first[maxn];
void addedge (int u,int v,int w)
{
e[++tot].next = first[u];
e[tot].to = v;
e[tot].w = w;
first[u] = tot;
}
struct Dijkstra{
int dis[maxn];
bool vis[maxn];
typedef pair<int,int> P;
priority_queue<P,vector<P>,greater<P> > q;
Dijkstra(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(0));
}
void work(int s){
dis[s] = 0;
q.push(make_pair(0,s));
while(!q.empty())
{
int now = q.top().second;
q.pop();
if(vis[now]) continue;
vis[now] = 1;
for(int i = first[now];i;i = e[i].next)
{
int v = e[i].to,w = e[i].w;
if(vis[v] == 0&&dis[v]>dis[now]+w)
{
dis[v] = dis[now]+w;
q.push(make_pair(dis[v],v));
}
}
}
}
}dijkstra;
int main ()
{
cin>>n>>m>>s;
for(int i = 0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
addedge(u,v,w);
addedge(v,u,w);
}
dijkstra.work(s);
int t = 1;
cout<<dijkstra.dis[t];
while(t++<n)
{
cout<<" "<<dijkstra.dis[t];
}
cout<<endl;
}