import sys,math,collections,itertools
input = sys.stdin.readline

#大きいものから適当に決める。
#総和は最大数を除いた和になる選び方ができる。
#適当に最大数を置いて、周囲に大きい数字から順に置いていく
#BFSかな
N = int(input())
road = [[] for _ in range(N+1)]#1~N番までの道
number = [0]*(N+1)#indexに置く数字のメモ。BFSでは0なら行き先追加
for _ in range(N-1):
    a,b=map(int,input().split())
    road[a].append(b)
    road[b].append(a)
c = list(map(int,input().split()))

q = collections.deque([])
cSort=sorted(c)
number[1]=cSort.pop()
q.append(1)

while q:
    now = q.popleft()
    for idx in road[now]:
        if number[idx]==0:
            q.append(idx)
            number[idx]=cSort.pop()
print(sum(number[2:]))
print(*number[1:])
     import sys,math,collections,itertools sys math collections itertools input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline N = int(input()) N int(input()) int input() input [] for _ in range(N+1) for _ in range(N+1) _ range(N+1) range N+1 N 1 for _ in range(N+1) [] road = [[] for _ in range(N+1)] road [[] for _ in range(N+1)] number = [0]*(N+1) number [0]*(N+1) [0] 0 N+1 N 1 for _ in range(N-1):
    a,b=map(int,input().split())
    road[a].append(b)
    road[b].append(a) _ range(N-1) range N-1 N 1 a,b=map(int,input().split()) a map(int,input().split()) map int input().split() ().split () input split b road[a].append(b) [a].append [a] road a append b road[b].append(a) [b].append [b] road b append a c = list(map(int,input().split())) c list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split q = collections.deque([]) q collections.deque([]) collections.deque collections deque [] cSort=sorted(c) cSort sorted(c) sorted c number[1]=cSort.pop() number[1] number 1 cSort.pop() cSort.pop cSort pop q.append(1) q.append q append 1 while q:
    now = q.popleft()
    for idx in road[now]:
        if number[idx]==0:
            q.append(idx)
            number[idx]=cSort.pop() q now = q.popleft() now q.popleft() q.popleft q popleft for idx in road[now]:
        if number[idx]==0:
            q.append(idx)
            number[idx]=cSort.pop() idx road[now] road now if number[idx]==0:
            q.append(idx)
            number[idx]=cSort.pop() number[idx]==0 number[idx] number idx 0 q.append(idx) q.append q append idx number[idx]=cSort.pop() number[idx] number idx cSort.pop() cSort.pop cSort pop print(sum(number[2:])) print sum(number[2:]) sum number[2:] number 2: 2 print(*number[1:]) print *number[1:] number[1:] number 1: 1 b=map(int,input().split()) map(int,input().split()) b a,b=map(int,input().split()) map(int,input().split()) a cSort=sorted(c) sorted(c) cSort number = [0]*(N+1) [0]*(N+1) number N = int(input()) int(input()) N input = sys.stdin.readline sys.stdin.readline input road = [[] for _ in range(N+1)] [[] for _ in range(N+1)] road c = list(map(int,input().split())) list(map(int,input().split())) c now = q.popleft() q.popleft() now q = collections.deque([]) collections.deque([]) q
import sys,math,collections,itertools
input = sys.stdin.readline

#大きいものから適当に決める。
#総和は最大数を除いた和になる選び方ができる。
#適当に最大数を置いて、周囲に大きい数字から順に置いていく
#BFSかな
N = int(input())
road = [[] for _ in range(N+1)]#1~N番までの道
number = [0]*(N+1)#indexに置く数字のメモ。BFSでは0なら行き先追加
for _ in range(N-1):
    a,b=map(int,input().split())
    road[a].append(b)
    road[b].append(a)
c = list(map(int,input().split()))

q = collections.deque([])
cSort=sorted(c)
number[1]=cSort.pop()
q.append(1)

while q:
    now = q.popleft()
    for idx in road[now]:
        if number[idx]==0:
            q.append(idx)
            number[idx]=cSort.pop()
print(sum(number[2:]))
print(*number[1:])
    
