import heapq
# python template for atcoder1
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline


N = int(input())
adj = [[] for _ in range(N)]

for _ in range(N-1):
    a, b = map(lambda x: int(x)-1, input().split())
    adj[a].append(b)
    adj[b].append(a)

# heapqで大きい順に取り出したいから、マイナスにしておく。
L = list(map(lambda x: -int(x), input().split()))
heapq.heapify(L)
# Maxは一番大きい数字以外の和.(全体の和-最大の整数)でも止める。
# Lはマイナスがかけてあるので、min(L)で最大の和が求まる
score = -sum(L)+min(L)


# nodeに書く数字
node = [-1]*N

# leafを探す,leafからbfsして訪問順に大きい数字を入れていく
leaf = -1
for i, a in enumerate(adj):
    if len(a) == 1:
        leaf = i
        break

# bfs
Q = [leaf]
while Q:
    cur = Q.pop()
    for a in adj[cur]:
        if node[a] == -1:  # まだたどり着いてないとこには、数字を入れる。
            node[a] = - heapq.heappop(L)
            Q.append(a)
print(score)
print("\n".join(map(str, node))) import heapq heapq import sys sys sys.setrecursionlimit(10**9) sys.setrecursionlimit sys setrecursionlimit 10**9 10 9 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) for _ in range(N) _ range(N) range N for _ in range(N) [] adj = [[] for _ in range(N)] adj [[] for _ in range(N)] for _ in range(N-1):
    a, b = map(lambda x: int(x)-1, input().split())
    adj[a].append(b)
    adj[b].append(a)

# heapqで大きい順に取り出したいから、マイナスにしておく。 _ range(N-1) range N-1 N 1 a, b = map(lambda x: int(x)-1, input().split()) a map(lambda x: int(x)-1, input().split()) map lambda x: int(x)-1 int(x)-1 int(x) int x 1 x input().split() ().split () input split b adj[a].append(b) [a].append [a] adj a append b adj[b].append(a) [b].append [b] adj b append a L = list(map(lambda x: -int(x), input().split())) L list(map(lambda x: -int(x), input().split())) list map(lambda x: -int(x), input().split()) map lambda x: -int(x) -int(x) int(x) int x x input().split() ().split () input split heapq.heapify(L) heapq.heapify heapq heapify L score = -sum(L)+min(L) score -sum(L)+min(L) -sum(L) sum(L) sum L min(L) min L node = [-1]*N node [-1]*N [-1] -1 N leaf = -1 leaf -1 for i, a in enumerate(adj):
    if len(a) == 1:
        leaf = i
        break

# bfs i a enumerate(adj) enumerate adj if len(a) == 1:
        leaf = i
        break

# bfs len(a) == 1 len(a) len a 1 leaf = i leaf i break Q = [leaf] Q [leaf] leaf while Q:
    cur = Q.pop()
    for a in adj[cur]:
        if node[a] == -1:  # まだたどり着いてないとこには、数字を入れる。
            node[a] = - heapq.heappop(L)
            Q.append(a) Q cur = Q.pop() cur Q.pop() Q.pop Q pop for a in adj[cur]:
        if node[a] == -1:  # まだたどり着いてないとこには、数字を入れる。
            node[a] = - heapq.heappop(L)
            Q.append(a) a adj[cur] adj cur if node[a] == -1:  # まだたどり着いてないとこには、数字を入れる。
            node[a] = - heapq.heappop(L)
            Q.append(a) node[a] == -1 node[a] node a -1 node[a] = - heapq.heappop(L) node[a] node a - heapq.heappop(L) heapq.heappop(L) heapq.heappop heapq heappop L Q.append(a) Q.append Q append a print(score) print score print("\n".join(map(str, node))) print "\n".join(map(str, node)) "\n".join "\n" join map(str, node) map str node leaf = -1 -1 leaf node = [-1]*N [-1]*N node Q = [leaf] [leaf] Q leaf = i i leaf a, b = map(lambda x: int(x)-1, input().split()) map(lambda x: int(x)-1, input().split()) a input = sys.stdin.readline sys.stdin.readline input N = int(input()) int(input()) N cur = Q.pop() Q.pop() cur score = -sum(L)+min(L) -sum(L)+min(L) score b = map(lambda x: int(x)-1, input().split()) map(lambda x: int(x)-1, input().split()) b adj = [[] for _ in range(N)] [[] for _ in range(N)] adj L = list(map(lambda x: -int(x), input().split())) list(map(lambda x: -int(x), input().split())) L
import heapq
# python template for atcoder1
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline


N = int(input())
adj = [[] for _ in range(N)]

for _ in range(N-1):
    a, b = map(lambda x: int(x)-1, input().split())
    adj[a].append(b)
    adj[b].append(a)

# heapqで大きい順に取り出したいから、マイナスにしておく。
L = list(map(lambda x: -int(x), input().split()))
heapq.heapify(L)
# Maxは一番大きい数字以外の和.(全体の和-最大の整数)でも止める。
# Lはマイナスがかけてあるので、min(L)で最大の和が求まる
score = -sum(L)+min(L)


# nodeに書く数字
node = [-1]*N

# leafを探す,leafからbfsして訪問順に大きい数字を入れていく
leaf = -1
for i, a in enumerate(adj):
    if len(a) == 1:
        leaf = i
        break

# bfs
Q = [leaf]
while Q:
    cur = Q.pop()
    for a in adj[cur]:
        if node[a] == -1:  # まだたどり着いてないとこには、数字を入れる。
            node[a] = - heapq.heappop(L)
            Q.append(a)
print(score)
print("\n".join(map(str, node)))