//code by virtualtan 2019/2
#include<cstdio>
#include<iostream>
#define INF 200000000
#define MAX 10001
int n,m,s;
int dis[MAX][MAX];
inline int read()
{
int x=0,k=1; char c=getchar();
while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*k;
}//快读
int main() {
n=read(),m=read(),s=read();
for(int i = 1; i <= n; i++) {
for(int j = 1;j <= n; j++) {
dis[i][j] = INF;//先初始化为正无穷
}
}
for(int i = 1, x, y, val; i <= m; i++) {
scanf("%d%d%d",&x,&y,&val);
dis[x][y] = std::min(dis[x][y], val);//如果有边相连 //可以解决重边
}//用邻接矩阵存图
for(int k = 1; k <= n; k++) {//k为中介点,就是一个DP
for(int i = 1; i <= n; i++) {//i为起点,j为终点
if(i == k || dis[i][k] == INF) continue;
for(int j = 1;j <= n; j++) {
if(dis[i][j] > dis[i][k] + dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
dis[s][s] = 0;
for(int i = 1; i <= n; i++)
if(i != s) printf("%d ",dis[s][i]);
else printf("0 ");
}
注:判断负环:如果存在u,使dis[u][u] < 0; 则存在负环
//参考代码&blog(实际上是比我写的好的多的东西)
https://ksmeow.moe/floyd_warshall/