program preprava;
{type Tradek=array[1..1] of  record
                                cislo:longint;
                                delka:byte;
                              end;
    PRadek=^TRadek;}

type  PRadek = ^TRadek;
TRadek = record cislo, delka:longint; next:PRadek; end; 

var {cesty:array[1..10000,1..1000] of record
                                        cislo:longint;
                                        delka:byte;
                                     end;
    }
    cesty:array[1..10000] of PRadek;
    pomradek:PRadek;
    pocetcest:array[1..10000] of longint;
    delka:array[0..10000] of longint;
    oznaceno:array[1..10000] of boolean;
    kam,max,maxi,m,n,a,b,i,j,x,y,v,pivot:longint;

  pp:Pointer;
begin
  readln(n,m,a,b);
while n<>0 do
begin
  max:=256*256*127;
  for i:=1 to 10000 do
    begin 
       pocetcest[i]:=0; delka[i]:=max; oznaceno[i]:=false; 
       cesty[i]:=nil;
    end;
  for i:=1 to m do
  begin
    readln(x,y,v);
    Inc(pocetcest[x]); Inc(pocetcest[y]);

    new(pomradek); pomradek^.delka:=v; pomradek^.cislo:=y;
    pomradek^.next:=cesty[x]; cesty[x]:=pomradek;
    
    new(pomradek); pomradek^.delka:=v; pomradek^.cislo:=x;
    pomradek^.next:=cesty[y]; cesty[y]:=pomradek;

 

  end;
 
  pivot:=a; delka[a]:=0;
  


  while pivot<>b do
  begin
   oznaceno[pivot]:=true;
   pomradek:=cesty[x];
   for i:=1 to pocetcest[pivot] do
   begin
    kam:=pomradek^.cislo;
    if delka[kam] > delka[pivot]+pomradek^.delka then
      delka[kam]:= delka[pivot]+pomradek^.delka;
     pomradek:=pomradek^.next;
   end;
   maxi:=0; delka[maxi]:=max;
   for i:=1 to n do
    if (delka[i]<delka[maxi])and (not oznaceno[i]) then maxi:=i;
   pivot:=maxi;
  end;
  
  writeln(delka[pivot]);

 readln(n,m,a,b);
end; 


end.
