#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5, M = 1e5 + 5;
struct Edge {
int to, w;
};
vector<Edge> vt[N];
int n, m, k, dis[N], ans[N], u[M], v[M], w[M];
void dij()
{
bool f[N];
memset(f, 0, sizeof(f));
dis[k] = 0;
for (int i = 1; i < n; ++i)
{
int k = 0;
for (int j = 1; j <= n; ++j)
if (!f[j] && dis[j] < dis[k])
k = j;
f[k] = true;
for (int j = 0; j < vt[k].size(); ++j)
{
int v = vt[k][j].to;
if (f[v])
continue;
int w = vt[k][j].w;
if (dis[v] > dis[k] + w)
dis[v] = dis[k] + w;
}
}
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i <= n; ++i)
dis[i] = 1e9;
for (int i = 1; i <= m; ++i)
{
scanf("%d%d%d", &u[i], &v[i], &w[i]);
vt[u[i]].push_back((Edge){v[i], w[i]});
}
dij();
for (int i = 1; i <= n; ++i)
ans[i] = dis[i];
for (int i = 1; i <= n; ++i)
vt[i].clear();
for (int i = 1; i <= m; ++i)
vt[v[i]].push_back((Edge){u[i], w[i]});
dij();
int maxx = -1;
for (int i = 1; i <= n; ++i)
{
if (dis[i] == 1e9)
continue;
ans[i] += dis[i];
maxx = max(maxx, ans[i]);
}
cout << maxx;
return 0;
}