//时间复杂度:O(NM)
//动态规划思想
//可以处理负边,可以检测出负环
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1010, maxm=10010, INF=0x3f3f3f3f;
int n, m, s, dis[maxn], u[maxm], v[maxm], w[maxm];
bool bellman_Ford()
{
for(int i=1; i<=m; i++) dis[i]=(i==s) ? 0 : INF;
for(int k=1; k<=n-1; k++)
for(int j=1; j<=m; j++)
if(dis[v[j]]>dis[u[j]]+w[j])
dis[v[j]]=dis[u[j]]+w[j];
//判断是否含有负权回路
for(int i=1; i<=m; i++) //n-1轮松弛后,仍可以松弛,此图必然存在负权回路
if(dis[v[i]]>dis[u[i]]+w[i]) return 0;
return true;
}
int main()
{
scanf("%d%d%d", &n, &m, &s);
for(int i=1; i<=m; i++) scanf("%d%d%d", &u[i], &v[i], &w[i]);
if(bellman_Ford()) for(int i=1; i<=n; i++) printf("%d ", dis[i]);
else printf("have negative circle\n"); //有负环
return 0;
}