#include <bits/stdc++.h>  // include all standard C++ libraries

using namespace std;

// Loops
#define _overload3(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=int(a);i<int(b);++i)
#define _rrep(i,n) rrepi(i,n,0)
#define rrepi(i,a,b) for(int i=int(a)-1;i>=int(b);--i)

#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)
#define rrep(...) _overload3(__VA_ARGS__,rrepi,_rrep,)(__VA_ARGS__)
#define each(xi, x) for (auto&& xi : x)
// Note: we can use rep(i,N) or rep(i,from,to)


// typedef
using ll = long long;
template <class T> using vec = vector<T>;
using vi   = vector<int>;
using vvi  = vector<vi>;
using vvvi = vector<vvi>;
using pii  = pair<int, int>;


// Constants

// Shorter repr for frequently used terms
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define Fi first
#define Se second


// Algorithms
#define all(x) (x).begin(), (x).end()
#define uniq(v) v.erase( unique(all(v)), v.end() )
#define perm(c) sort(all(c));for(bool c##p=1;c##p;c##p=next_permutation(all(c)))

template<class T> pair<T, size_t> max(vector<T> &x){ auto it = max_element(all(x)); return mp(*it, it-x.begin()); }
template<class T> pair<T, size_t> min(vector<T> &x){ auto it = min_element(all(x)); return mp(*it, it-x.begin()); }

template<class T> inline bool chmax(T &maxval, const T &newval) { if (maxval<newval) { maxval=newval; return 1; } return 0; }
template<class T> inline bool chmin(T &minval, const T &newval) { if (minval>newval) { minval=newval; return 1; } return 0; }

// Utilities
// Grid world utilities
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
#define inside(H,W,y,x) 0<=(x) && (x)<(W) && 0<=(y) && (y)<(H)

inline int in() {int x; cin >> x; return x;} // read int from cin
inline  ll IN() {ll x; cin >> x; return x;}  // read ll from cin



// Debug
#ifdef LOCAL
  #include "dump.hpp"
  #define debug(x) cerr << #x << ": " << x << '\n'
#else
  #define dump(...)
  #define debug(x)
#endif

// Paste snippets here!!
// 

// int main(){
//   cin.tie(0); ios::sync_with_stdio(false);    // Magic for faster cin
//   int N = in();
//   priority_queue<int, vector<int>, greater<int>> q;

//   vi a(N-1); vi b(N-1); vi c(N); vi deg(N,0); vvi G(N);
//   vi ret(N);
//   vi bucket(1+N/100,0);
//   dump(N);
//   rep(i,N-1) cin >> a[i] >> b[i];
//   rep(i,N) { cin >> c[i]; q.push(c[i]); }
//   rep(i,N-1){
//     deg[a[i]-1]++; deg[b[i]-1]++;
//     G[a[i]-1].pb(b[i]-1); G[b[i]-1].pb(a[i]-1);
//   }
//   rep(i,N){
//     bucket[i/100] = min(bucket[i/100], deg[i]);
//   }
//   dump(deg);
//   rep(r,N){
//     //auto it = min_element(all(deg));
//     //int i = it-deg.begin();
//     auto it = min_element(all(bucket));
//     int b = it-bucket.begin();
//     int i, imin; int m=numeric_limits<int>::max();
//     for(i=100*b; i<min(N,100*(b+1)); i++){
//       if(deg[i]<m) { m=deg[i]; imin=i; }
//     }
//     i = imin;

//     dump(i);
//     int ci = q.top(); q.pop();
//     ret[i] = ci;
//     for(int j : G[i]){
//       deg[j]--; bucket[j/100] = min(bucket[j/100], deg[j]);
//     }
//     deg[i] = 2*N;
//     m=2*N;
//     for(int k=100*b; k<min(N,100*(b+1)); k++){
//       if(deg[k]<m) { m=deg[k]; }
//     }
//     bucket[b] = m;
//   }
//   int M=0;
//   rep(i,N-1){
//     M += min(ret[a[i]-1], ret[b[i]-1]);
//   }
//   cout << M << endl;
//   rep(i,N-1) cout << ret[i] << " ";
//   cout << ret[N-1] << endl;
//   return 0;
// }


int main(){
  cin.tie(0); ios::sync_with_stdio(false);    // Magic for faster cin
  int N = in();
  priority_queue<int, vector<int>, greater<int>> q;

  vi a(N-1); vi b(N-1); vi c(N); vi deg(N,0); vvi G(N);
  vi ret(N);
  vi bucket(1+N/100,0);
  dump(N);
  rep(i,N-1) cin >> a[i] >> b[i];
  rep(i,N) { cin >> c[i]; q.push(c[i]); }
  rep(i,N-1){
    deg[a[i]-1]++; deg[b[i]-1]++;
    G[a[i]-1].pb(b[i]-1); G[b[i]-1].pb(a[i]-1);
  }
  dump(deg);
  rep(r,N){
    auto it = min_element(all(deg));
    int i = it-deg.begin();
    dump(i);
    int ci = q.top(); q.pop();
    ret[i] = ci;
    for(int j : G[i]){
      deg[j]--;
    }
    deg[i] = 2*N;
  }
  int M=0;
  rep(i,N-1){
    M += min(ret[a[i]-1], ret[b[i]-1]);
  }
  cout << M << endl;
  rep(i,N-1) cout << ret[i] << " ";
  cout << ret[N-1] << endl;
  return 0;
}


Measured memory_bytes: 1280