#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 1e3;
const int MAXM = 250000;
const int INF = 0x3f3f3f3f;
struct MGraph{
int n, m;
int edges[MAXN][MAXN];
};
void init_MGraph(MGraph& g, int n){
memset(g.edges, INF, sizeof(g.edges));
g.n = n;
g.m = 0;
}
void add_edge(MGraph& g, int a, int b, int l){
g.edges[a][b] = l;
g.m++;
}
void Dijkstra(MGraph g, int v, int* dist, int* path){
int s[MAXN];
memset(s, 0, sizeof(s));
int mindist, i, j, u;
s[v] = 1;
path[v] = 0;
for(int i=0; i<g.n; i++){
dist[i] = g.edges[v][i];
s[i] = 0;
if(g.edges[v][i] < INF){
path[i] = v;
}
else{
path[i] = -1;
}
}
for(int i=0; i<g.n-1; i++){
mindist = INF;
for(int j=0; j<g.n; j++){
if(s[j] == 0 && dist[j] < mindist){
u=j;
mindist=dist[j];
}
}
s[u]=1;
for(int j=0; j<g.n; j++){
if(s[j] == 0){
if(g.edges[u][j] < INF && dist[u] + g.edges[u][j] < dist[j]){
dist[j] = dist[u] + g.edges[u][j];
path[j] = u;
}
}
}
}
}
int main(){
int N, M, X;
while(cin >> N >> M >> X){
int a, b, c;
int ans = 0;
MGraph g1, g2;
init_MGraph(g1, N);
init_MGraph(g2, N);
for(int i=0; i<M; i++){
cin >> a >> b >> c;
add_edge(g1, a-1, b-1, c);
add_edge(g2, b-1, a-1, c);
}
int dist1[MAXN], path1[MAXN];
int dist2[MAXN], path2[MAXN];
Dijkstra(g1, X-1, dist1, path1);
Dijkstra(g2, X-1, dist2, path2);
for(int i=0; i<N; i++){
ans = max(ans, dist1[i] + dist2[i]);
}
cout << ans << endl;
}
return 0;
}