#include <iostream>
#include <vector>
#include <queue>
#define MAX_NODE 1000
#define INFINITE 1000000
using namespace std;
int N, M, X;
int MinTime[MAX_NODE + 1], dist[MAX_NODE + 1];
vector<pair<int, int>> adj[MAX_NODE + 1];
int dikstra(int from, int to)
{
priority_queue<pair<int, int>,vector<pair<int, int> >,greater<pair<int, int> > > pq; //작은수가 우선순위임.
for (int i = 1; i <= N; i++)
dist[i] = INFINITE;
dist[from] = 0;
pq.push(make_pair(0, from));
while (!pq.empty())
{
int min_dist = pq.top().first;
int min_node = pq.top().second;
pq.pop();
for (int v = 0; v < adj[min_node].size(); v++) {
int next_node = adj[min_node][v].first;
int next_dist = min_dist + adj[min_node][v].second;
if (next_dist < dist[next_node]) {
dist[next_node] = next_dist;
pq.push(make_pair(next_dist, next_node));
}
}
}
return dist[to];
}
int main()
{
int MaxTime = 0;
cin >> N >> M >> X;
for (int i = 0; i < M; i++) {
int from, to, time;
cin >> from >> to >> time;
adj[from].push_back(make_pair(to, time));
}
for (int v = 1; v <= N; v++)
{
if (v == X) continue;
MinTime[v] = dikstra(v, X);
}
dikstra(X, 1); //특정 지점 노드에서 다른노드까지 최단거리 거리구하기 위함. 1은 그냥 임의의 값.
for (int v = 1; v <= N; v++)
{
MinTime[v] += dist[v];
if (MaxTime < MinTime[v])
MaxTime = MinTime[v];
}
cout << MaxTime;
return 0;
}
//간단히 요약하자면 먼저 각 노드의 최단거리의 값을 구한다음 특정 노드에서 다른 노드들 까지의 최단거리를 구하면 된다.