var
n,m,i,t,w,d,s,e,x,y,z:longint;
next,a,v,c:array[1..101000]of longint;
head,f:array[1..10010]of longint;
u:array[1..10010]of boolean;
procedure init;
begin
readln(n,m,s,e); //读入
for i:=1 to m do
begin
readln(x,y,z);
next[2*i-1]:=head[x]; //next记录下一个与x相连的边对应的i
head[x]:=i*2-1; //当前x对应的i
a[2*i-1]:=y; //记录边
v[2*i-1]:=z; //记录边权
next[2*i]:=head[y];
head[y]:=2*i;
a[2*i]:=x;
v[2*i]:=z; //注意双向道路
end;
for i:=1 to n do
f[i]:=maxlongint; //初始化
f[s]:=0;
end;
procedure spfa; //SPFA
begin
t:=1; w:=1; //t:头指针; w:尾指针;
c[t]:=s; u[s]:=true; //c:队列; u:记录是否在队列中
while t<>w+1 do
begin
d:=head[c[t]];
while d<>0 do
begin
if f[c[t]]+v[d]<f[a[d]] then
begin
f[a[d]]:=f[c[t]]+v[d]; //对a[d]的距离进行更新
if not u[a[d]] then //当a[d]不在队列中时
begin
inc(w);
c[w]:=a[d];
u[a[d]]:=true;
end;
end;
d:=next[d]; //用邻接表查找下一个与c[t]相邻的点
end;
u[c[t]]:=false; //将c[t]出队
inc(t); //头指针后移一位
end;
end;
procedure output;
begin
writeln(f[e]);
end;
begin
init;
spfa;
output;
end.