{$APPTYPE CONSOLE}

const
  NMAX = 100;

type
  TVector = array[1..NMAX] of Byte;

var
  n: longint;
  a: array[1..NMAX,1..NMAX] of byte;
  leaves: array[1..NMAX] of boolean;
  i,j,u,v,tmp: longint;

  gc: TVector;
  gcN: Integer;

{найти гамильтонов цикл, проходящий через ребро uv}
procedure FindGC(u,v: longint; var gc:TVector; var gcN: longint);
var
  i,v1,u1: longint;
  gc1, gc2: TVector;
  gc1N, gc2N: Integer;
  swap: boolean;
begin
  if leaves[u] and leaves[v] then
  begin
    gcN := 2; gc[1] := u; gc[2] := v;exit;
  end;
  if leaves[v] then begin
    i:=u; u:=v; v:=i; swap:=true;
  end else
    swap := false;

  {удаляем рассматриваемое ребро}
  a[u,v]:=0; a[v,u]:=0;

  if leaves[u] then
  begin {случай 1 - листовое ребро}   
    {корректируем признак листа для v}
    tmp:=0;
    for i:=1 to n do if a[v,i]=1 then inc(tmp);
    if tmp=1 then leaves[v]:=true else leaves[v]:=false;
    {находим гамильтонов цикл для поддерева}
    i:=1; while a[v,i]=0 do inc(i);
    FindGC(v,i,gc1,gc1N);
    {вставляем ребро в наш гамильтонов цикл}
    if not swap then
    begin
      gcN:=2; gc[1]:=u; gc[2]:=v;
      for i:=gc1N downto 2 do
      begin
        inc(gcN); gc[gcN]:=gc1[i];
      end;
    end else
    begin
      gcN:=2; gc[1]:=v; gc[2]:=u;
      for i:=2 to gc1N do begin
        inc(gcN); gc[gcN]:=gc1[i];
      end;
    end;
  end else
  begin {случай 2 - не листовое ребро}
    {корректируем признак листа для v}
    tmp:=0;
    for i:=1 to n do if a[v,i]=1 then inc(tmp);
    if tmp=1 then leaves[v]:=true else leaves[v]:=false;
    {корректируем признак листа для u}
    tmp:=0;
    for i:=1 to n do if a[u,i]=1 then inc(tmp);
    if tmp=1 then leaves[u]:=true else leaves[u]:=false;
    {находим гамильтонов цикл для u}
    u1:=1; while a[u,u1]=0 do inc(u1);
    FindGC(u,u1,gc1,gc1N);
    {находим гамильтонов цикл для v}
    v1:=1; while a[v,v1]=0 do inc(v1);
    FindGC(v,v1,gc2,gc2N);
    {объединяем найденные циклы}
    gc[1] := gc1[1];
    gc[2] := gc2[1];
    gcN:=2;
    for i:=gc2N downto 2 do 
    begin
      inc(gcN); gc[gcN]:=gc2[i];
    end;
    for i:=2 to gc1N do 
    begin
      inc(gcN); gc[gcN]:=gc1[i];
    end;
  end;
end;

begin

//  assign(input,'input.txt'); reset(input);
//  assign(output,'output.txt'); rewrite(output);

  fillchar(a,sizeof(a),0);
  fillchar(leaves,sizeof(leaves),0);
  readln(n);
  for i:=1 to n-1 do begin
    readln(u,v); a[u,v]:=1; a[v,u]:=1;
  end;

  if n<2 then begin writeln('NO'); exit; end;

  for i:=1 to n do
  begin
    tmp := 0;
    for j:=1 to n do if a[i,j]=1 then inc(tmp);
    if tmp=1 then leaves[i] := true;
  end;
  j:=1;
  while a[1,j]<>1 do inc(j);
  FindGC(1,j,gc,gcN);
  writeln('YES');
  for i:=1 to gcN do write(gc[i],' ');
  writeln(gc[1]);
end.
