#include <bits/stdc++.h>
using namespace std;

typedef long long ll; // -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807

template <class T> using vec = std::vector<T>;
template <class T> using vec2 = vec<vec<T>>;
template <class T> using vec3 = vec<vec<vec<T>>>;

// #define DEBUG
#define INF 1123456

class Fenwick{
    public:
    ll size;
    vec<pair<ll, int>> data;

    Fenwick(int N){
        size = 1;
        while(size < N){
            size *= 2;
        }
        data = vec<pair<ll, int>>(size*2, pair<ll, int>(INF, -1));
        for(int i=0; i < N; i++){
            data.at(i + size) = pair<ll, int>(0, i);
        }
    }

    pair<ll, int> getAt(int k){
        return data.at(k + size);
    }

    pair<ll, int> getMin(int s, int t, int k=1, int l=0, int r=-1){
        r = (r == -1 ? size : r);

        if(t <= l || r <= s){
            return pair<ll, int>(INF, -1);
        }

        if(s <= l && r <= t){
            return data.at(k);
        }

        auto subL = getMin(s, t, 2*k, l, (l+r)/2);
        auto subR = getMin(s, t, 2*k+1, (l+r)/2, r);
        return min(subL, subR);
    }

    void update(int k){
        if(k == 0){
            return;
        }

        data.at(k) = min(data.at(k*2), data.at(k*2+1));

        update(k/2);
    }

    void put(int k, ll val, int pos){
        data.at(k + size) = pair<ll, int>(val, pos);
        update((k+size)/2);
    }




};

void solve(long long N, std::vector<long long> a, std::vector<long long> b, std::vector<long long> c){
    // shift
    for(int i=0; i < N-1; i++){
        a.at(i)--;
        b.at(i)--;
    }

    Fenwick fw(N); // i番の頂点に何本の枝がはえてるか。はえてないときはINFをかえす
    vec<ll> cntEdge(N);
    for(int i=0; i < N-1; i++){
        cntEdge.at(a.at(i))++;
        cntEdge.at(b.at(i))++;
    }

    for(int i=0; i < N; i++){
        fw.put(i, cntEdge.at(i), i);
    }

    vec2<int> edges(N);
    for(int i=0; i < N-1; i++){
        edges.at(a.at(i)).push_back(b.at(i));
        edges.at(b.at(i)).push_back(a.at(i));
    }



    // solve
    // コストは小さい順にソート
    sort(c.begin(), c.end());

    vec<ll> res(N); // i番になにをおくか
    for(int i=0; i < N; i++){
        // 最小の点をもとめる
        auto minNode = fw.getMin(0, N);
        // assert(minNode.first == 1);
        // そこに最小値をおく
        res.at(minNode.second) = c.at(i);
        // そこにはえてる枝を全部もとめる(1こしかないとおもうけど)
        // そこにつながってる2頂点のはえてるかずを1つずつへらす(0になったらINFにする)
        for(auto iter: edges.at(minNode.second)){
            auto other = fw.getAt(iter);
            if(other.first == INF){
                continue;
            }

            other.first--;
            // assert(other.first > 0);
            fw.put(other.second, other.first, other.second);
        }
        // この頂点をつぶす(つながってる本数を0にする)
        fw.put(minNode.second, INF, minNode.second);

        #ifdef DEBUG
        printf("*START: hoge\n");
        for(auto iter: fw.data){
            auto temp = iter.first;
            if(temp == INF){
                temp = -2;
            }
            cout << temp << "\t";
        }
        cout << endl;
        printf("*END: hoge\n");
        #endif
    }

    // calc
    ll total = 0;
    for(int i=0; i < N-1; i++){
        total += min(res.at(a.at(i)), res.at(b.at(i)));
    }

    cout << total << endl;
    for(int i=0; i < res.size(); i++){
        cout << res.at(i);
        if(i == res.size() - 1){
            cout << endl;
        }else{
            cout << " ";
        }
    }



}

// Generated by 1.1.6 https://github.com/kyuridenamida/atcoder-tools  (tips: You use the default template now. You can remove this line by using your custom template)
int main(){
    long long N;
    scanf("%lld",&N);
    std::vector<long long> a(N-1);
    std::vector<long long> b(N-1);
    for(int i = 0 ; i < N-1 ; i++){
        scanf("%lld",&a[i]);
        scanf("%lld",&b[i]);
    }
    std::vector<long long> c(N);
    for(int i = 0 ; i < N ; i++){
        scanf("%lld",&c[i]);
    }
    solve(N, std::move(a), std::move(b), std::move(c));
    return 0;
}


Measured memory_bytes: 1792