var
d:array[1..7000] of longint;
a:array[1..3000,1..3000] of longint;
mark:array[1..7000] of boolean;
n,b,c,e:longint;
proceduredij(v0:integer);var
i,j,u,min:integer;
begin
fillchar(mark,sizeof(mark),false);
mark[v0]:=true;
for i:=1to n do
d[i]:=a[v0,i];
repeat
u:=0;min:=maxint;
for i:=1to n doif (not mark[i])and(d[i]<min) thenbegin
u:=i;
min:=d[i];
end;
if u<>0thenbegin
mark[u]:=true;
for i:=1to n doif (not mark[i])and(d[u]+a[u,i]<d[i])thenbegin
d[i]:=d[u]+a[u,i];
end;
end;
until u=0;
end;
procedureinit;var
i,x,y,z:longint;
begin
readln(n,b,c,e);
for i:=1to b dobegin
readln(x,y,z);
a[x,y]:=z;
a[y,x]:=z;
end;
end;
begin
fillchar(a,sizeof(a),$7f);
init;
dij(c);
writeln(d[e]);
end.