#include <queue>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define x make_pair
const int N = 1010, M = 100010;
int n, m, s, ans;
int dis1[N], dis2[N];
int u[N], v[N], w[N];
int h[M], e[M], t[M], c[M], cnt;
bool vis[N];
void add(int a, int b, int d) {
e[++ cnt] = h[a], c[cnt] = d, t[cnt] = b, h[a] = cnt;
}
void dijkstra(int s) {
memset(vis, 0, sizeof(vis));
priority_queue<pair<int, int> > q;
q.push(x(0, s));
dis1[s] = 0;
while(q.size()) {
int u = q.top().second;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = h[u]; i ; i = e[i]) {
int v = t[i];
if(dis1[v] > dis1[u] + c[i]) {
dis1[v] = dis1[u] + c[i];
q.push(x(-dis1[v], v));
}
}
}
}
int main() {
cin >> n >> m >> s;
for(int i = 1; i <= n; ++ i)
dis1[i] = 0x3f3f3f3f;
for(int i = 1; i <= m; ++ i) {
cin >> u[i] >> v[i] >> w[i];
add(u[i], v[i], w[i]);
}
dijkstra(s);
memset(h, 0, sizeof(h));
for(int i = 1; i <= n; ++ i) {
dis2[i] = dis1[i];
dis1[i] = 0x3f3f3f3f;
}
cnt = 0;
for(int i = 1; i <= m; ++ i)
add(v[i], u[i], w[i]);
dijkstra(s);
for(int i = 1; i <= n; ++ i) {
ans = max(ans, dis1[i] + dis2[i]);
}
cout << ans;
return 0;
}