#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e3 + 2, M = 1e5 + 2;
struct Edge {
int v, w, ne;
};
Edge e[M];
int h[N], cnt;
int n, m, s;
int tu[N], tv[N], tw[N];
int dis[N], tmp[N], ans;
bool vis[N];
priority_queue<pair<int, int>> q;
void adde(const int &u, const int &v, const int &w) {
e[++cnt].v = v;
e[cnt].w = w;
e[cnt].ne = h[u];
h[u] = cnt;
}
void dij(const int &s) {
memset(dis, 0x7f, sizeof(dis));
dis[s] = 0;
q.push(make_pair(-dis[s], s));
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = true;
for (int i = h[u]; i; i = e[i].ne) {
int v = e[i].v;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
q.push(make_pair(-dis[v], v));
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m >> s;
for (int i = 1; i <= m; ++i) {
cin >> tu[i] >> tv[i] >> tw[i];
adde(tu[i], tv[i], tw[i]);
}
dij(s);
for (int i = 1; i <= n; ++i) {
tmp[i] = dis[i];
}
cnt = 0;
memset(h, 0, sizeof(h));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= m; ++i) {
adde(tv[i], tu[i], tw[i]);
}
dij(s);
for (int i = 1; i <= n; ++i) {
ans = max(ans, tmp[i] + dis[i]);
}
cout << ans << endl;
return 0;
}
AC * 7, WA * 3