/*一道双向求最短路的题...不要建两个VECTOR来利用传参求解,VECTOR传过去特别慢,利用记边,然后构两次图,来达到目的*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=10000;
const int maxm=1<<29;
int n,m,o;
vector< pair<int,int> > g[maxn];
long long dis[maxn];//,pre[maxn],cnt[maxn];cnt[i]>n则表示有负环
int e[3][maxn];
bool spfa(int s)
{
queue<int> que;
bool inque[maxn];
memset(inque,0,sizeof(inque));
// memset(pre,0,sizeof(pre));memset(cnt,0,sizeof(cnt));
que.push(s);inque[s]=1;
for(int i=0;i<=n;i++)dis[i]=maxm;
dis[s]=0; //pre[s]=s;cnt[s]++;
while(!que.empty())
{
int v=que.front();
que.pop();inque[v]=0;
for(int i=0;i<g[v].size();i++)
{
int u=g[v][i].first;
if(dis[v]+g[v][i].second < dis[u])
{
dis[u]=dis[v]+g[v][i].second;// pre[u]=i;cnt[u]++;if(cnt[u]>n)return 0;
if(!inque[u])
{
que.push(u);
inque[u]=1;
}
}
}
}
return 1;
}
long long ans;
int t;
int d[maxn];
int main()
{
//freopen("3268.txt","r",stdin);
int s;
{
scanf("%d%d%d",&n,&m,&s);
for(int i=0;i<=n;i++)g[i].clear();
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&e[0][i],&e[1][i],&e[2][i]);
g[e[0][i]].push_back(make_pair(e[1][i],e[2][i]));
}
spfa(s);
for(int i=1;i<=n;i++)
{
d[i]+=dis[i];
}
for(int i=1;i<=n;i++)g[i].clear();
for(int i=0;i<m;i++)
{
g[e[1][i]].push_back(make_pair(e[0][i],e[2][i]));
}
spfa(s);
for(int i=1;i<=n;i++)
{
d[i]+=dis[i];
}
int ma=0;
for(int i=1;i<=n;i++)
{
ma=max(d[i],ma);
}
printf("%d\n",ma);
}
return 0;
}