正+反向建路,两次贝尔曼福特
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class POJ_3268 {
private static final int INF =99999 ;
static int n,m,x;
static class edge{
int a,b,t;
}
static edge e[]=new edge[100005];
static int[] d=new int[1005];
static int[] d1=new int[1005];
static edge e1[]=new edge[100005];
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < e.length; i++) {
e[i]=new edge();
e1[i]=new edge();
}
String[] s=br.readLine().split(" ");
n=Integer.parseInt(s[0]);
m=Integer.parseInt(s[1]);
x=Integer.parseInt(s[2]);
for (int i = 0; i < m; i++) {
String[] s1=br.readLine().split(" ");
int a=Integer.parseInt(s1[0]);
int b=Integer.parseInt(s1[1]);
int t=Integer.parseInt(s1[2]);
e[i].a=a;
e[i].b=b;
e[i].t=t;
e1[i].a=b;
e1[i].b=a;
e1[i].t=t;
}
shortest_path(x,e,d);
shortest_path(x,e1,d1);
int max=0;
for (int i = 1; i <= n; i++) {
max=Math.max(max,d[i]+d1[i]);
}
System.out.println(max);
}
static void shortest_path(int s,edge[] e,int[] d){
Arrays.fill(d,INF);
d[s]=0;
while(true){
boolean update=false;
for (int i = 0; i < m; i++) {
edge ed=e[i];
if(d[ed.a]!=INF&&d[ed.b]>d[ed.a]+ed.t){
d[ed.b]=d[ed.a]+ed.t;
update=true;
}
}
if(!update)break;
}
}
}