1 #include<bits/stdc++.h>
2 using namespace std;
3 struct node{
4 int to,next,w;
5 }a[21000];
6 queue<int>q;
7 int n,m,x,num,head[100001],ma=-1,mi,cnt;
8 int d[10001],z[1001][1001],di[10001];
9 bool b[10001];
10 void add(int from,int to,int w)
11 {
12 a[++cnt].to=to;
13 a[cnt].next=head[from];
14 a[cnt].w=w;
15 head[from]=cnt;
16 }
17 void spfa(int s)
18 {
19 memset(d,127,sizeof(d));
20 d[s]=0;b[s]=true;
21 q.push(s);
22 while(!q.empty())
23 {
24 int u=q.front();q.pop();
25 for(int i=head[u];i;i=a[i].next)
26 {
27 int to=a[i].to;
28 if(d[to]>d[u]+a[i].w)
29 {
30 d[to]=d[u]+a[i].w;
31 if(!b[to])
32 {
33 b[to]=true;
34 q.push(to);
35 }
36 }
37 }
38 b[u]=false;//别忘了这句话
39 }
40 }
41 int main()
42 {
43 //freopen("party.in","r",stdin);
44 //freopen("party.out","w",stdout);
45 cin>>n>>m>>x;
46 for(int i=1;i<=m;i++)
47 {
48 int a,b,c;
49 cin>>a>>b>>c;
50 add(a,b,c);
51 }
52 spfa(x);//从x到各点的最短路径
53 memcpy(di,d,sizeof d);//将数组d的值全部复制给di
54 for(int i=1;i<=n;i++)
55 {
56 if(i!=x)
57 {
58 spfa(i);//各点到x的最短路径
59 ma=max(ma,d[x]+di[i]);//求最短中的最长
60 }
61 }
62 cout<<ma;
63 return 0;
64 }