3const INP = '' ;
OUT = '' ;
maxn = 200 ;
maxc = 1000000000 ;
var n , P : integer ;
c : array[1..maxn] of longint ;
d : array[1..maxn,1..maxn] of longint ;
a : array[1..maxn,1..maxn] of boolean ;
trace : array[1..maxn,1..maxn] of byte ;
fi , fo : text ;
procedure visit( u : longint ) ;
var
v , i , j : integer ;
begin
d[u,1] := c[u] ;
for v := 1 to n do
if a[u,v] then begin
a[v,u] := false ;
visit( v ) ;
for i := P downto 1 do
for j := 1 to i - 1 do
if d[u,i] < d[u,j] + d[v,i-j] then begin
d[u,i] := d[u,j] + d[v,i-j] ;
trace[v,i] := i - j ;
end ;
end ;
end ;
procedure truy_vet( u , P : integer ) ;
var
v : integer ;
begin
for v := n downto 1 do
if a[u,v] and ( trace[v,P] > 0 ) then begin
truy_vet( v , trace[v,P] ) ;
dec( P , trace[v,P] ) ;
end ;
write( fo , u ,' ' ) ;
end ;
procedure process ;
var
vt , u : integer ;
begin
visit( 1 ) ;
vt := 1 ;
for u := 2 to n do
if d[u,P] > d[vt,P] then vt := u ;
truy_vet( vt , P ) ;
end ;
procedure init ;
var
u , k : integer ;
begin
for u := 1 to n do
for k := 1 to P do d[u,k] := - maxc ;
end ;
procedure nhapdl ;
var
i , u , v : longint ;
begin
read( fi , n , P ) ;
for i := 1 to n do read( fi , c[i] ) ;
for i := 1 to n - 1 do begin
read( fi , u , v ) ;
a[u,v] := true ;
a[v,u] := true ;
end ;
end ;
procedure mofile ;
begin
assign( fi , INP ) ; reset( fi ) ;
assign( fo , OUT ) ; rewrite( fo ) ;
end ;
procedure dongfile ;
begin
close( fi ) ; close( fo ) ;
end ;
BEGIN
mofile ;
nhapdl ;
init ;
process ;
dongfile ;
END.