#include <stdio.h>
#include <iostream>
#include <stack>
#include <string.h>
#include <queue>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
/*
int m, n ;
int a[105][105];
int b[105][105];
int check(int x, int y) {
if (0 <= x && x < n && 0 <= y && y < m) {
return 1;
} else {
return 0;
}
}
int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy[8] = {-1, 1, -1, 0, 1, 0, 1, -1};
bool cmp(pair<int, int> a, pair<int, int> b)
{
if(a.second != b.second){
return a.second < b.second;
}
}
*/
int n, m, x;
struct edge {
int to;
int w;
};
vector<edge> G[1005];
vector<edge> rG[1005];
int d[1005];
#define INF 0x3fffffff
struct Node {
int to;
int d;
Node (int _to, int _d) {
to = _to;
d = _d;
}
bool operator < (const Node b) const {
return d > b.d;
}
bool operator > (const Node b) const {
return d < b.d;
}
};
void short_path(int s) {
for (int i = 0; i < n; i++) {
d[i] = INF;
}
priority_queue<Node> q;
d[s] = 0;
q.push(Node(s, 0));
while (!q.empty()) {
Node cur = q.top();
q.pop();
//if (d[cur.to] < cur.d) continue;
for (int i = 0; i < G[cur.to].size(); i++) {
edge e = G[cur.to][i];
if (d[e.to] > d[cur.to] + e.w) {
d[e.to] = d[cur.to] + e.w;
q.push(Node(cur.to, d[e.to]));
}
}
}
}
void short_rpath(int s) {
for (int i = 0; i < n; i++) {
d[i] = INF;
}
priority_queue<Node> q;
d[s] = 0;
q.push(Node(s, 0));
while (!q.empty()) {
Node cur = q.top();
q.pop();
//if (d[cur.to] < cur.d) continue;
for (int i = 0; i < G[cur.to].size(); i++) {
edge e = G[cur.to][i];
if (d[e.to] > d[cur.to] + e.w) {
d[e.to] = d[cur.to] + e.w;
q.push(Node(cur.to, d[e.to]));
}
}
}
}
void add_edge(int u, int v, int w) {
edge e;
e.to = v;
e.w = w;
G[u].push_back(e);
/*
e.to = u;
e.w = w;
G[v].push_back(e);
*/
}
void add_redge(int u, int v, int w) {
edge e;
e.to = v;
e.w = w;
rG[u].push_back(e);
/*
e.to = u;
e.w = w;
G[v].push_back(e);
*/
}
int main() {
cin >> n >> m >> x;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
add_edge(u, v, w);
add_redge(v, u, w);
}
short_path(x);
int ans = 0;
for (int i = 0; i < n; i++) {
if (d[i] != INF)
ans = max(ans, *d[i]);
}
short_rpath(x);
for (int i = 0; i < n; i++) {
if (d[i] != INF && i != x)
ans = max(ans, 2*d[i]);
}
/*
freopen("in.txt", "r", stdin);
//freopen("out.txt","w",stdout);
map<int, double> mapp1;
int n;
cin >> n;
for(int i = 0; i < n; i++){
int esp;
double coeff;
cin >> esp >> coeff;
if(mapp1[esp] != 0){
mapp1[esp] += coeff;
}else {
mapp1[esp] = coeff;
}
}
int m;
cin >> m;
for(int i = 0; i < m; i++){
int esp;
double coeff;
cin >> esp >> coeff;
if(mapp1[esp] != (double)0.0){
mapp1[esp] += coeff;
}else {
mapp1[esp] = coeff;
}
}
vector<pair<int, double>> v1(mapp1.begin(), mapp1.end());
sort(v1.begin(), v1.end(), cmp);
vector<pair<int, double> > v2;
for(int i = 0; i < v1.size(); i++){
if(v1[i].second != (double)0.0){
pair<int, double> x(v1[i].first, v1[i].second);
v2.push_back(x);
}
}
cout << v2.size();
for(int i = 0; i < v2.size(); i++){
printf(" %d %.1lf", v2[i].first, v2[i].second);
}
*/
/*cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int num = 0;
for (int k = 0; k < 8; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (check(x, y) && a[x][y] == 1) {
num++;
}
}
if (a[i][j] == 1) {
if (num < 2 || num > 3) {
b[i][j] = 0;
} else if (num == 2 || num == 3){
b[i][j] = 1;
}
} else {
if (num == 3) {
b[i][j] = 1;
}
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (j == 0) {
cout << b[i][j];
} else {
cout << " " << b[i][j];
}
}
cout << endl;
}*/
/*
// freopen("in.txt", "r", stdin);
int n;
map<int, int> mapp;
vector<pair<int, int>> vec;
int num;
while(scanf("%d", &num) && num){
//if(n == 0) break;
//int num;
// cin >> num;
if(num == 1){
int id, P;
cin >> id >> P;
//mapp[id] = P;
vec.insert(vec.begin(), make_pair(id, P));
sort(vec.begin(), vec.end(), cmp);
}else if(num == 2){
if(vec.size() != 0){
//sort(mapp.begin(),mapp.end(), cmp);
sort(vec.begin(), vec.end(), cmp);
vector<pair<int, int>>::iterator iter;
iter = vec.end();
iter--;
cout << iter -> first << endl;
vec.erase(iter);
}else{
cout << "0" << endl;
}
}else if(num == 3){
if(vec.size() != 0){
// vector<pair<int, int>> vec(mapp.begin(), mapp.end());
sort(vec.begin(), vec.end(), cmp);
vector<pair<int, int>>::iterator iter;
iter = vec.begin();
cout << iter -> first << endl;
vec.erase(iter);
}else{
cout << "0" << endl;
}
}
}
*/
/*
int T;
cin >> T;
while (T--) {
int n, k;
cin >> n >> k;
int m[105];
int p[105];
int pre[105];
int ans[105];
memset(m, 0, sizeof(m));
memset(p, 0, sizeof(p));
memset(pre, 0, sizeof(pre));
memset(ans, 0, sizeof(ans));
for (int i = 1; i <= n; i++) {
cin >> m[i];
}
for (int i = 1; i <= n; i++) {
cin >> p[i];
}
/*
for (int i = 2; i <= n; i++) {
for (int j = i-1; j >= 1; j--) {
if (m[i] - m[j] > k) {
pre[i] = j;
//cout << "i = " << i << " j = " << j << endl;
break;
}
}
}
*/
/*
ans[1] = p[1];
for (int i = 2; i <= n; i++) {
ans[i] = max(ans[i-1], p[i] + ans[pre[i]]);
// cout << ans[i] << endl;
}
for (int i = 2; i <= n; i++) {
for (int j = i-1; j >= 1; j--) {
if (m[i] - m[j] > k) {
ans[i] = max(ans[i-1], p[i] + ans[j]);
break;
}
}
}
cout << ans[n] << endl;
}
*/
return 0;
}