#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=1e3+50;
const int maxm=1e5+50;
const int inf=0x3f3f3f3f;
struct edge{
int u;
int v;
int w;
int next;
}e1[maxm],e2[maxn];
int head1[maxn],dis1[maxn],inq1[maxn],cnt1=0;
int head2[maxn],dis2[maxn],inq2[maxn],cnt2=0;
void add1(int u,int v,int w){
cnt1++;
e1[cnt1].u=u;
e1[cnt1].v=v;
e1[cnt1].w=w;
e1[cnt1].next=head1[u];
head1[u]=cnt1;
}
void add2(int u,int v,int w){
cnt2++;
e2[cnt2].u=u;
e2[cnt2].v=v;
e2[cnt2].w=w;
e2[cnt2].next=head2[u];
head2[u]=cnt2;
}
int n,m,x;
void spfa1(int s){
for(int i=1;i<=n+1;i++) dis1[i]=inf;
queue<int>q;
q.push(s);
dis1[s]=0;
inq1[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
inq1[u]=0;
for(int i=head1[u];i>0;i=e1[i].next){
int v=e1[i].v;
int w=e1[i].w;
if(dis1[v]>dis1[u]+w){
dis1[v]=dis1[u]+w;
if(!inq1[v]){
q.push(v);
inq1[v]=1;
}
}
}
}
}
void spfa2(int s){
for(int i=1;i<=n+1;i++) dis2[i]=inf;
queue<int>q;
q.push(s);
dis2[s]=0;
inq2[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
inq2[u]=0;
for(int i=head2[u];i>0;i=e2[i].next){
int v=e2[i].v;
int w=e2[i].w;
if(dis2[v]>dis2[u]+w){
dis2[v]=dis2[u]+w;
if(!inq2[v]){
q.push(v);
inq2[v]=1;
}
}
}
}
}
int read(){
int x=0;
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
{
x=x*10+(c-'0');
c=getchar();
}
return x;
}
int main(){
//freopen("inn.txt","r",stdin);
//freopen("outt.txt","w",stdout);
scanf("%d%d%d",&n,&m,&x);
for(int i=1;i<=m;i++){
int u,v,w;
u=read();
v=read();
w=read();
add1(u,v,w);
add2(v,u,w);
}
spfa1(x);
spfa2(x);
int ans=-1;
for(int i=1;i<=n;i++)
ans= ans>(dis1[i]+dis2[i]) ? ans : (dis1[i]+dis2[i]);
printf("%d",ans);
//fclose(stdin);
//fclose(stdout);
return 0;
}