/*两次单源最短路径
输入的时候一次正向记录路径
一次反向记录路径 */
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF 99999
int t[1001][1001],dd[1001][1001];
int v[1001],dp[1001],dp2[1001];
int n,w;
void f(int d[][1001])
{
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
{
d[i][i]=0;
dp[i]=(i==w?0:INF);
}
for(int i=1;i<=n;i++)
{
int x,m=INF;
for(int y=1;y<=n;y++)
if(!v[y]&&dp[y]<m)
{
m=dp[y];
x=y;
}
v[x]=1;
for(int y=1;y<=n;y++)
if(dp[y]>dp[x]+d[x][y])
dp[y]=dp[x]+d[x][y];
}
}
int main()
{
int m;
cin>>n>>m>>w;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{t[i][j]=INF;dd[i][j]=INF;}
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
dd[a][b]=c;
t[b][a]=c;
}
f(dd);
for(int i=1;i<=n;i++)
{dp2[i]+=dp[i];}
f(t);
int max=0;
for(int i=1;i<=n;i++)
{dp2[i]+=dp[i];
if(dp2[i]>max)
max=dp2[i];}
cout<<max<<endl;
return 0;
}