1 #include <stdio.h>
2 #include <string.h>
3 #include <algorithm>
4 using namespace std;
5 const int inf=1<<29;
6 const int N=1001;
7 int w[N][N],d[N];
8 int u,v,c,m,n,k;
9 struct node
10 {
11 int from;
12 int to;
13 int c;
14 }e[N*N];
15 bool Bellman_ford(int st)
16 {
17 for(int i=1;i<=n;i++)
18 {
19 d[i]=inf;
20 }
21 d[st]=0;
22 for(int i=1;i<n;i++)
23 {
24 for(int j=0;j<=2*m;j++)
25 {
26 if(d[e[j].to]>d[e[j].from]+e[j].c)
27 {
28 d[e[j].to]=d[e[j].from]+e[j].c;
29 //更新的是该点到起点的距离d[*],则其他通过(该点)的点回到起点的距离也有可能会被更新
30 //所以要循环n-1次,保证所有边都能够更新完,(若每次循环都只更新一条边,就会更新n-1次);
31 }//与dij比较,更新后没有标记,可以持续更新;
32
33 }
34 }
35 for(int i=0;i<2*m;i++)//如果持续更新,则存在负权环,抛出错误(如果是无向图,回路中只要存在一个负值,就会形成负权环)
36 if(d[e[i].to]>d[e[i].from]+e[i].c)
37 return true;
38 return false;
39 }
40 int main()
41 {
42 while(scanf("%d%d",&n,&m)!=EOF)
43 {
44 for(int i=0;i<2*m;i+=2)//人为付成无向图
45 {
46 scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].c);
47 e[i+1].from=e[i].to;
48 e[i+1].to=e[i].from;
49 e[i+1].c=e[i].c;
50 }
51 scanf("%d",&k);
52 if(Bellman_ford(k))
53 printf("-1\n");
54 else
55 {
56 for(int i=2;i<=n;i++)
57 printf("%d %d\n",i,d[i]);
58 }
59 }
60 return 0;
61 }