#include<iostream>#include<string>#include<cmath>#include<ctype.h>#include<memory.h>#include<string.h>#include<algorithm>#include<map>#include<iomanip>#include<set>#include<list>#include<vector>#include<stack>#include<queue>#define ll long long intusingnamespace std;constint INF =100000+10;constint maxn =1010;int n, m, x;int Map[maxn][maxn];int dis[maxn];int vis[maxn];int ans[maxn];voiddijkstra(int s){memset(vis,0,sizeof(vis));memset(dis,0,sizeof(dis));for(int i =1; i <= n; i++)
dis[i]= Map[s][i];//必须是s->i,因为传入的参数是起点,且图为有向图
vis[s]=1;for(int i =1; i <= n; i++){int Min = INF;int min_pos =-1;for(int j =1; j <= n; j++)if(dis[j]< Min &&!vis[j]){
Min = dis[j];
min_pos = j;}if(min_pos !=-1)
vis[min_pos]=1;for(int j =1; j <= n; j++){if(dis[j]> dis[min_pos]+ Map[min_pos][j]&&!vis[j])
dis[j]= dis[min_pos]+ Map[min_pos][j];}}}intmain(){
cin >> n >> m >> x;for(int i =1; i <= n; i++)for(int j =1; j <= n; j++)
Map[i][j]= i == j ?0: INF;for(int i =1; i <= m; i++){int u, v, w;
cin >> u >> v >> w;
Map[u][v]= w;}dijkstra(x);//求返回途中的耗费(起点是x)for(int i =1; i <= n; i++)
ans[i]+= dis[i];for(int i =1; i <= n; i++)//将单向路转向for(int j = i +1; j <= n; j++)swap(Map[i][j], Map[j][i]);dijkstra(x);//转置后,以x为起点,求到x的耗费for(int i =1; i <= n; i++)
ans[i]+= dis[i];int ANS =0;for(int i =1; i <= n; i++)
ANS =max(ANS, ans[i]);
cout << ANS << endl;return0;}