RT
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 1e3 + 5;
typedef long long ll;
typedef pair<ll, int> P;
int n, m, x;
ll ans, dis1[N], dis2[N];
bool vis1[N], vis2[N];
vector<P> g[N], f[N];
void Dij1(int s) {
memset(dis1, 0x3f, sizeof(dis1));
priority_queue<P, vector<P>, greater<P> > q;
dis1[x] = 0; q.push(P(0, s));
while(!q.empty()) {
int u = q.top().y; q.pop();
if(vis1[u]) continue;
vis1[u] = 1;
for(int i = 0; i < g[u].size(); i ++) {
P v = g[u][i];
if(dis1[v.y] > dis1[u] + v.x) {
dis1[v.y] = dis1[u] + v.x;
q.push(v);
}
}
}
}
void Dij2(int s) {
memset(dis2, 0x3f, sizeof(dis2));
priority_queue<P, vector<P>, greater<P> > q;
dis2[x] = 0; q.push(P(0, s));
while(!q.empty()) {
int u = q.top().y; q.pop();
if(vis2[u]) continue;
vis2[u] = 1;
for(int i = 0; i < f[u].size(); i ++) {
P v = f[u][i];
if(dis2[v.y] > dis2[u] + v.x) {
dis2[v.y] = dis2[u] + v.x;
q.push(v);
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &x);
for(int i = 1, u, v, w; i <= m; i ++) {
scanf("%d%d%d", &u, &v, &w);
g[u].push_back(P(w, v));
f[v].push_back(P(w, u));
}
Dij1(x); // from x to i (in g)
Dij2(x); // from i to x = from x to i (in f)
for(int i = 1; i <= n; i ++)
ans = max(ans, dis1[i] + dis2[i]);
cout << ans;
return 0;
}