1 #include <iostream>
2 #include <cstdio>
3 #include <cmath>
4 #include <cstring>
5 #include <algorithm>
6 #include <queue>
7 #include <stack>
8 #include <vector>
9 #include <iomanip>
10 #include <climits>
11 using namespace std;
12 int n,m,x,d[1100],d1[1100];
13 vector<pair<int,int> >e[1100];
14 vector<pair<int,int> >g[1100];
15 int main(int argc, char *argv[])
16 {
17 scanf("%d%d%d",&n,&m,&x);
18 for(int i=0;i<=n;i++)
19 {
20 d[i]=1e9;d1[i]=1e9;
21 }
22 for(int i=0;i<m;i++)
23 {
24 int x,y,z;
25 scanf("%d%d%d",&x,&y,&z);
26 e[x].push_back(make_pair(y,z));
27 g[y].push_back(make_pair(x,z));
28 }
29 d[x]=0;
30 priority_queue<pair<int,int> >q;
31 q.push(make_pair(-d[x],x));
32 while(!q.empty())
33 {
34 int now=q.top().second;
35 q.pop();
36 for(int i=0;i<e[now].size();i++)
37 {
38 int v=e[now][i].first;
39 if(d[v]>d[now]+e[now][i].second)
40 {
41 d[v]=d[now]+e[now][i].second;
42 q.push(make_pair(-d[v],v));
43 }
44 }
45 }
46 d1[x]=0;
47 q.push(make_pair(-d1[x],x));
48 while(!q.empty())
49 {
50 int now=q.top().second;
51 q.pop();
52 for(int i=0;i<g[now].size();i++)
53 {
54 int v=g[now][i].first;
55 if(d1[v]>d1[now]+g[now][i].second)
56 {
57 d1[v]=d1[now]+g[now][i].second;
58 q.push(make_pair(-d1[v],v));
59 }
60 }
61 }
62 int mmax=0;
63 for(int i=1;i<=n;i++)
64 {
65 if(d[i]!=1e9&&d1[i]!=1e9)
66 mmax=max(mmax,d[i]+d1[i]);
67 }
68 printf("%d\n",mmax);
69 return 0;
70 }