#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
vector<int> g[310];
int n, k, d[310], dp[310][310], dis[310][310], ans[310];
void dfs(int x, int fa = 0) {
  for (int i = 1; i <= n; i++) dp[x][i] = d[dis[x][i]];
  int nn = g[x].size() - 1;
  for (int xx = 0; xx <= nn; xx++) {
    int to = g[x][xx];
    if (to != fa) {
      dfs(to, x);
      for (int i = 1; i <= n; i++) {
        int mn = 0x3f3f3f3f;
        for (int j = 1; j <= n; j++)
          if (dis[x][i] <= dis[x][j] && dis[to][j] <= dis[to][i])
            mn = min(mn, dp[to][j]);
        dp[x][i] += mn;
      }
    }
  }
}
void dfs1(int x, int i, int fa = 0) {
  if (x == i) ans[x] = x;
  int nn = g[x].size() - 1;
  for (int xx = 0; xx <= nn; xx++) {
    int to = g[x][xx];
    if (to != fa) {
      pair<int, int> mn = make_pair(0x3f3f3f3f, 0);
      for (int j = 1; j <= n; j++)
        if (dis[x][i] <= dis[x][j] && dis[to][j] <= dis[to][i])
          mn = min(mn, make_pair(dp[to][j], j));
      dfs1(to, mn.second, x);
    }
  }
}
int main() {
  n = read();
  k = read();
  d[0] = k;
  for (int i = 1; i <= n - 1; i++) d[i] = read();
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) dis[i][j] = 0x3f3f3f3f;
  for (int i = 1; i <= n; i++) dis[i][i] = 0;
  for (int i = 1; i <= n - 1; i++) {
    int u = read();
    int v = read();
    g[u].push_back(v);
    g[v].push_back(u);
    dis[u][v] = dis[v][u] = 1;
  }
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  dfs(1);
  int t = min_element(dp[1] + 1, dp[1] + n + 1) - dp[1];
  dfs1(1, t);
  printf("%d\n", dp[1][t]);
  for (int i = 1; i <= n; i++) {
    if (!ans[i])
      for (int j = 1; j <= n; j++)
        if (ans[j] == j && (!ans[i] || dis[ans[i]][i] > dis[j][i])) ans[i] = j;
    printf("%d ", ans[i]);
  }
  return 0;
}
