#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
typedef pair<int,int> PII;
const int MAX_N=100010;
const int MAX_M=200010;
int n,m,s,u,v,l,bh;
int p[MAX_N],dis[MAX_N];
bool vis[MAX_N];
struct jgt{
int v,l,next;
}e[MAX_M];
void init()
{
memset(p,-1,sizeof(p));
memset(dis,0x3f,sizeof(dis));
}
void insert(int u,int v,int l)
{
e[bh].v=v;
e[bh].l=l;
e[bh].next=p[u];
p[u]=bh++;
}
void dj(int u)
{
set<PII,less<PII> > heap;
dis[u]=0;
heap.insert(make_pair(0,u));
for(int i=1;i<=n;i++)
{
if(heap.size()==0)
{
return ;
}
else
{
set<PII>::iterator it=heap.begin();
int point=(*it).second;
vis[point]=true;
heap.erase(make_pair(dis[point],point));
for(int i=p[point];~i;i=e[i].next)
{
int v=e[i].v,l=e[i].l;
if(dis[v]>l+dis[point])
{
heap.erase(make_pair(dis[v],v));
dis[v]=l+dis[point];
heap.insert(make_pair(dis[v],v));
}
}
}
}
return ;
}
int main()
{
init();
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&l);
insert(u,v,l);
}
dj(s);
for(int i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
return 0;
}