#include <bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x) {
  x = 0;
  int op = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') op = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x *= op;
}
template <typename Tp>
void CMax(Tp &x, Tp y) {
  if (y > x) x = y;
}
template <typename Tp>
void CMin(Tp &x, Tp y) {
  if (y < x) x = y;
}
const int N = 205;
const int INF = 0x3f3f3f3f;
int n, k;
int d[N];
vector<int> T[N];
void Adde(int x, int y) {
  T[x].push_back(y);
  T[y].push_back(x);
}
int dis[N][N];
void GetDis(int x, int fa, int rt) {
  for (auto y : T[x])
    if (y != fa) {
      dis[rt][y] = dis[rt][x] + 1;
      GetDis(y, x, rt);
    }
}
int f[N][N], best[N];
void DP(int x, int fa) {
  for (auto y : T[x])
    if (y != fa) DP(y, x);
  int mn = INF;
  for (int i = (1); i <= (n); ++i) {
    f[x][i] = d[dis[x][i]] + k;
    for (auto y : T[x])
      if (y != fa) {
        f[x][i] += min(f[y][i] - k, f[y][best[y]]);
      }
    if (f[x][i] < mn) {
      mn = f[x][i];
      best[x] = i;
    }
  }
}
int pos[N];
void GetPos(int x, int fa, int p) {
  pos[x] = p;
  for (auto y : T[x])
    if (y != fa) {
      if (f[y][p] - k < f[y][best[y]])
        GetPos(y, x, p);
      else
        GetPos(y, x, best[y]);
    }
}
int main() {
  read(n);
  read(k);
  for (int i = (1); i <= (n - 1); ++i) read(d[i]);
  int x, y;
  for (int i = (2); i <= (n); ++i) read(x), read(y), Adde(x, y);
  for (int i = (1); i <= (n); ++i) GetDis(i, 0, i);
  DP(1, 0);
  printf("%d\n", f[1][best[1]]);
  GetPos(1, 0, best[1]);
  for (int i = (1); i <= (n); ++i) printf("%d ", pos[i]);
  return 0;
}
