'use strict'

const INF = 900719925474099;
function mapint(temp){
    return temp.split(' ').map((v)=>parseInt(v));
}


function Main(input){
    let temp = input.trim().split('\n');
    let n = parseInt(temp[0]);

    let ab = new Array(n+1);
    let count = [];

    //初期化
    count.push({c:-1,n:0});
    for(let i=1;i<=n;i++){
        count.push({c:0,n:i});
    }
    //console.log(count);
    //カウント
    let a,b;
    for(let i=1;i<n;i++){
        ab[i] = mapint(temp[i]);
        count[ab[i][0]].c += 1;
        count[ab[i][1]].c += 1;
    }
    let c = mapint(temp[n]);

    c.sort((a,b)=>b-a);
    count.sort((a,b)=>b.c-a.c);


    //頂点の値計算
    let ans = new Array(n);
    for(let i=0;i<n;i++){
        ans[count[i].n-1] = c[i];
    }

    //辺の合計値計算
    let sum = 0;
    //console.log(ans);
    for(let i=1;i<n;i++){
        //console.log(ab[i],ans[ab[i][0]-1],ans[ab[i][1]-1])
        sum += Math.min( ans[ab[i][0]-1], ans[ab[i][1]-1] );
    }

    console.log(sum);
    console.log(ans.join(' '));
}
//*この行以降は編集しないでください（標準入出力から一度に読み込み、Mainを呼び出します）
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
