#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2500 + 5;
int n, m, s, u[N], v[N], w[N], dis1[N], dis2[N], maxx;
bool vis[N];
struct Node {
int v, w;
};
vector<Node> e[N];
priority_queue<pair<int, int> > q;
void dijkstra1(int s) {
memset(dis1, 0x3f3f3f3f, sizeof dis1);
dis1[s] = 0;
q.push(make_pair(0, s));
while(!q.empty()) {
int x = q.top().second;
q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(auto v : e[x]) {
int y = v.v, z = v.w;
if(dis1[y] > dis1[x] + z) {
dis1[y] = dis1[x] + z;
q.push(make_pair(-dis1[y], y));
}
}
}
}
void dijkstra2(int s) {
memset(vis, 0, sizeof vis);
memset(dis2, 0x3f3f3f3f, sizeof dis2);
dis2[s] = 0;
q.push(make_pair(0, s));
while(!q.empty()) {
int x = q.top().second;
q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(auto v : e[x]) {
int y = v.v, z = v.w;
if(dis2[y] > dis2[x] + z) {
dis2[y] = dis2[x] + z;
q.push(make_pair(-dis2[y], y));
}
}
}
}
int main() {
cin >> n >> m >> s;
for(int i = 1; i <= m; ++ i) {
cin >> u[i] >> v[i] >> w[i];
e[u[i]].push_back(Node{v[i], w[i]});
}
dijkstra1(s);
for(int i = 1; i <= n; ++ i)
e[i].clear();
for(int i = 1; i <= m; ++ i)
e[v[i]].push_back(Node{u[i], w[i]});
dijkstra2(s);
for(int i = 1; i <= n; ++ i) {
if(dis1[i] == 0x3f3f3f3f || dis2[i] == 0x3f3f3f3f) continue;
maxx = max(maxx, dis1[i] + dis2[i]);
}
cout << maxx;
return 0;
}