#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int dis,too;
bool operator <( const node &x )const
{
return x.dis < dis;
}
};
vector<node> v[100010];
priority_queue<node> q;
int n,m,s;
int read()
{
int x=0,f=1;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int d[100010],vis[100010],pre[100010];
void dij()
{
fill(d,d+100010,99999999);
fill(vis,vis+100010,0);
d[s]=0;
q.push((node){0,s});
while(!q.empty())
{
node tmp=q.top();
int x=tmp.too;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=0;i<v[x].size();i++)
{
int y=v[x][i].too;
int dis=v[x][i].dis;
if(dis+d[x]<d[y])
{
d[y]=dis+d[x];
if(vis[y]==0) q.push((node){d[y],y});
}
}
}
}
int main()
{
n=read(),m=read(),s=read();
for(int i=0;i<m;i++)
{
int a=read(),b=read(),c=read();
v[a].push_back((node){c,b});
}
dij();
for(int i=1;i<=n;i++) printf("%d ",d[i]);
return 0;
}