#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#define INF 0x3f3f3f
using namespace std;
const int L = 200000;
struct Edge{
int to;
int next;
int dis;
}e[L*2];
int n,m,s;
int dist[L];
bool tag[L];
int num[L];
int head[L];
bool SPAF(int v0)
{
queue<int> q;
dist[v0]=0;
q.push(v0);
num[v0]++;
tag[v0]=true;
while(!q.empty())
{
int t=q.front();
q.pop();
tag[t]=false;
for(int i=head[t];i!=-1;i=e[i].next)
{
int v=e[i].to;
if(dist[v]>dist[t]+e[i].dis)
{
dist[v]=dist[t]+e[i].dis;
if(!tag[v])
{
tag[v]=true;
q.push(v);
num[v]++;
if(num[v]>n) return false;
}
}
}
}
return true;
}
int main()
{
cin>>n>>m>>s;
int u,v,w;
for(int i=0;i<=n;i++)
{
head[i]=-1;
dist[i]=INF;
tag[i]=false;
num[i]=0;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
e[i].to=v;
e[i].dis=w;
e[i].next=head[u];
head[u]=i;
}
if(SPAF(s))
{
for(int i=1;i<=n;i++)
if(dist[i]<INF)
cout<<dist[i]<<endl;
else
cout<<"NO PATH"<<endl;
}
return 0;
}