import sys;sys.setrecursionlimit(10**6)
    #双方向に連結しろ！！！！！！！
from collections import *
    #双方向に連結しろ！！！！！！！
d=defaultdict(list)
    #双方向に連結しろ！！！！！！！
n=int(input())
    #双方向に連結しろ！！！！！！！
start=2
    #双方向に連結しろ！！！！！！！
for i in range(n-1):
    #双方向に連結しろ！！！！！！！
    a,b=map(int,input().split())
    #双方向に連結しろ！！！！！！！
    d[a].append(b)
    #双方向に連結しろ！！！！！！！
    d[b].append(a)
    #双方向に連結しろ！！！！！！！
    start=min(start,a)
    #双方向に連結しろ！！！！！！！
*p,=sorted(map(int,input().split()))
    #双方向に連結しろ！！！！！！！
ans=[0 for i in range(n)]
    #双方向に連結しろ！！！！！！！
def DFS_dict(point,TFlist):
    #双方向に連結しろ！！！！！！！
    if all(TFlist):
    #双方向に連結しろ！！！！！！！
        return 1
    #双方向に連結しろ！！！！！！！
    for i in d[point]:
    #双方向に連結しろ！！！！！！！
        if TFlist[i-1]:
    #双方向に連結しろ！！！！！！！
            continue
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=True
        ans[i-1]=p.pop()
    #双方向に連結しろ！！！！！！！
        DFS_dict(i,TFlist)
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=False
    #双方向に連結しろ！！！！！！！
    return ans
    #双方向に連結しろ！！！！！！！
TFlist=[False]*n
    #双方向に連結しろ！！！！！！！
TFlist[start-1]=True
    #双方向に連結しろ！！！！！！！
score=sum(p)-max(p)
    #双方向に連結しろ！！！！！！！
ans[start-1]=p.pop()
    #双方向に連結しろ！！！！！！！
ans=DFS_dict(start,TFlist)
    #双方向に連結しろ！！！！！！！
print(score)
    #双方向に連結しろ！！！！！！！
print(*ans) import sys sys sys.setrecursionlimit(10**6) sys.setrecursionlimit sys setrecursionlimit 10**6 10 6 from collections import * d=defaultdict(list) d defaultdict(list) defaultdict list n=int(input()) n int(input()) int input() input start=2 start 2 for i in range(n-1):
    #双方向に連結しろ！！！！！！！
    a,b=map(int,input().split())
    #双方向に連結しろ！！！！！！！
    d[a].append(b)
    #双方向に連結しろ！！！！！！！
    d[b].append(a)
    #双方向に連結しろ！！！！！！！
    start=min(start,a)
    #双方向に連結しろ！！！！！！！ i 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 d[a].append(b) [a].append [a] d a append b d[b].append(a) [b].append [b] d b append a start=min(start,a) start min(start,a) min start a *p,=sorted(map(int,input().split())) *p p sorted(map(int,input().split())) sorted map(int,input().split()) map int input().split() ().split () input split 0 for i in range(n) for i in range(n) i range(n) range n for i in range(n) 0 ans=[0 for i in range(n)] ans [0 for i in range(n)] def DFS_dict(point,TFlist):
    #双方向に連結しろ！！！！！！！
    if all(TFlist):
    #双方向に連結しろ！！！！！！！
        return 1
    #双方向に連結しろ！！！！！！！
    for i in d[point]:
    #双方向に連結しろ！！！！！！！
        if TFlist[i-1]:
    #双方向に連結しろ！！！！！！！
            continue
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=True
        ans[i-1]=p.pop()
    #双方向に連結しろ！！！！！！！
        DFS_dict(i,TFlist)
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=False
    #双方向に連結しろ！！！！！！！
    return ans
    #双方向に連結しろ！！！！！！！ DFS_dict if all(TFlist):
    #双方向に連結しろ！！！！！！！
        return 1
    #双方向に連結しろ！！！！！！！
     all(TFlist) all TFlist return 1 1 for i in d[point]:
    #双方向に連結しろ！！！！！！！
        if TFlist[i-1]:
    #双方向に連結しろ！！！！！！！
            continue
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=True
        ans[i-1]=p.pop()
    #双方向に連結しろ！！！！！！！
        DFS_dict(i,TFlist)
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=False
    #双方向に連結しろ！！！！！！！
     i d[point] d point if TFlist[i-1]:
    #双方向に連結しろ！！！！！！！
            continue
    #双方向に連結しろ！！！！！！！
         TFlist[i-1] TFlist i-1 i 1 continue TFlist[i-1]=True TFlist[i-1] TFlist i-1 i 1 True ans[i-1]=p.pop() ans[i-1] ans i-1 i 1 p.pop() p.pop p pop DFS_dict(i,TFlist) DFS_dict i TFlist TFlist[i-1]=False TFlist[i-1] TFlist i-1 i 1 False return ans ans point point TFlist TFlist TFlist=[False]*n TFlist [False]*n [False] False n TFlist[start-1]=True TFlist[start-1] TFlist start-1 start 1 True score=sum(p)-max(p) score sum(p)-max(p) sum(p) sum p max(p) max p ans[start-1]=p.pop() ans[start-1] ans start-1 start 1 p.pop() p.pop p pop ans=DFS_dict(start,TFlist) ans DFS_dict(start,TFlist) DFS_dict start TFlist print(score) print score print(*ans) print *ans ans b=map(int,input().split()) map(int,input().split()) b TFlist=[False]*n [False]*n TFlist n=int(input()) int(input()) n d=defaultdict(list) defaultdict(list) d start=min(start,a) min(start,a) start start=2 2 start ans=DFS_dict(start,TFlist) DFS_dict(start,TFlist) ans score=sum(p)-max(p) sum(p)-max(p) score a,b=map(int,input().split()) map(int,input().split()) a ans=[0 for i in range(n)] [0 for i in range(n)] ans def DFS_dict(point,TFlist):
    #双方向に連結しろ！！！！！！！
    if all(TFlist):
    #双方向に連結しろ！！！！！！！
        return 1
    #双方向に連結しろ！！！！！！！
    for i in d[point]:
    #双方向に連結しろ！！！！！！！
        if TFlist[i-1]:
    #双方向に連結しろ！！！！！！！
            continue
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=True
        ans[i-1]=p.pop()
    #双方向に連結しろ！！！！！！！
        DFS_dict(i,TFlist)
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=False
    #双方向に連結しろ！！！！！！！
    return ans
    #双方向に連結しろ！！！！！！！ def DFS_dict(point,TFlist):
    #双方向に連結しろ！！！！！！！
    if all(TFlist):
    #双方向に連結しろ！！！！！！！
        return 1
    #双方向に連結しろ！！！！！！！
    for i in d[point]:
    #双方向に連結しろ！！！！！！！
        if TFlist[i-1]:
    #双方向に連結しろ！！！！！！！
            continue
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=True
        ans[i-1]=p.pop()
    #双方向に連結しろ！！！！！！！
        DFS_dict(i,TFlist)
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=False
    #双方向に連結しろ！！！！！！！
    return ans
    #双方向に連結しろ！！！！！！！ DFS_dict
import sys;sys.setrecursionlimit(10**6)
    #双方向に連結しろ！！！！！！！
from collections import *
    #双方向に連結しろ！！！！！！！
d=defaultdict(list)
    #双方向に連結しろ！！！！！！！
n=int(input())
    #双方向に連結しろ！！！！！！！
start=2
    #双方向に連結しろ！！！！！！！
for i in range(n-1):
    #双方向に連結しろ！！！！！！！
    a,b=map(int,input().split())
    #双方向に連結しろ！！！！！！！
    d[a].append(b)
    #双方向に連結しろ！！！！！！！
    d[b].append(a)
    #双方向に連結しろ！！！！！！！
    start=min(start,a)
    #双方向に連結しろ！！！！！！！
*p,=sorted(map(int,input().split()))
    #双方向に連結しろ！！！！！！！
ans=[0 for i in range(n)]
    #双方向に連結しろ！！！！！！！
def DFS_dict(point,TFlist):
    #双方向に連結しろ！！！！！！！
    if all(TFlist):
    #双方向に連結しろ！！！！！！！
        return 1
    #双方向に連結しろ！！！！！！！
    for i in d[point]:
    #双方向に連結しろ！！！！！！！
        if TFlist[i-1]:
    #双方向に連結しろ！！！！！！！
            continue
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=True
        ans[i-1]=p.pop()
    #双方向に連結しろ！！！！！！！
        DFS_dict(i,TFlist)
    #双方向に連結しろ！！！！！！！
        TFlist[i-1]=False
    #双方向に連結しろ！！！！！！！
    return ans
    #双方向に連結しろ！！！！！！！
TFlist=[False]*n
    #双方向に連結しろ！！！！！！！
TFlist[start-1]=True
    #双方向に連結しろ！！！！！！！
score=sum(p)-max(p)
    #双方向に連結しろ！！！！！！！
ans[start-1]=p.pop()
    #双方向に連結しろ！！！！！！！
ans=DFS_dict(start,TFlist)
    #双方向に連結しろ！！！！！！！
print(score)
    #双方向に連結しろ！！！！！！！
print(*ans)