#include <iostream>
#define MAX_INT 217483647
using namespace std;
int edge[1001][1001], dist[2][1001];
bool visit[2][1001];
int main()
{
int n, m, s, i, j;
//입력 및 초기화
cin >> n >> m >> s;
for (i = 0; i<m; i++)
{
int a, b, c;
cin >> a >> b >> c;
edge[a][b] = c;
}
for (i = 0; i <= n; i++)
{
visit[0][i] = false, visit[1][i] = false;
dist[0][i] = MAX_INT, dist[1][i] = MAX_INT;
}
//첫번째도 두번째도 시작점에서 dist = 0
dist[0][s] = 0, dist[1][s] = 0;
for (i = 0; i<n; i++)
{
int min1 = 0, min2 = 0;
//min1,min2값 탐색
for (j = 1; j <= n; j++)
{
if (visit[0][j] == false && dist[0][min1]>dist[0][j]) min1 = j;
if (visit[1][j] == false && dist[1][min2]>dist[1][j]) min2 = j;
}
//visit check
visit[0][min1] = true;
visit[1][min2] = true;
//경로 탐색
for (j = 1; j <= n; j++)
{
//기존 dijkstra와 동일
if (dist[0][j]>dist[0][min1] + edge[min1][j] && edge[min1][j] != 0) dist[0][j] = dist[0][min1] + edge[min1][j];
//반대로 edge를 먼저 생각하고 dist를 생각한다.
if (dist[1][j]>edge[j][min2] + dist[1][min2] && edge[j][min2] != 0) dist[1][j] = edge[j][min2] + dist[1][min2];
}
}
//최댓값 탐색
int res = 0;
for (i = 1; i <= n; i++)
{
if (res<dist[0][i] + dist[1][i] && dist[0][i] != MAX_INT && dist[1][i] != MAX_INT) res = dist[0][i] + dist[1][i];
}
//출력
cout << res;
return 0;
}