#include <bits/stdc++.h>
const int N = 200;
int opt[N], dp[N][N];
int dis[N][N];
std::vector<int> edge[N];
int k, n, cost[N], control[N];
void dfs(int u, int f) {
  std::vector<int> chd;
  for (int i = 0; i < (int)edge[u].size(); i++) {
    int v = edge[u][i];
    if (v == f) continue;
    dfs(v, u);
    chd.push_back(v);
  }
  for (int w = 0; w < n; w++) {
    dp[u][w] = cost[dis[u][w]];
    for (int i = 0; i < (int)chd.size(); i++) {
      int v = chd[i];
      dp[u][w] += std::min(dp[v][w], opt[v]);
    }
  }
  opt[u] = 1000000000;
  for (int w = 0; w < n; w++) {
    if (dp[u][w] + k < opt[u]) {
      opt[u] = dp[u][w] + k;
      control[u] = w;
    }
  }
}
int ans[N];
void print(int u, int f, int w) {
  int nw = -1;
  if (dp[u][w] < opt[u]) {
    nw = w;
  } else {
    nw = control[u];
  }
  ans[u] = nw;
  for (int i = 0; i < (int)edge[u].size(); i++) {
    if (edge[u][i] != f) {
      print(edge[u][i], u, nw);
    }
  }
}
int main() {
  int a, b;
  scanf("%d%d", &n, &k);
  for (int i = 1; i < n; i++) scanf("%d", &cost[i]);
  for (int i = 0; i < n; i++) {
    dis[i][i] = 0;
    for (int j = i + 1; j < n; j++) {
      dis[i][j] = dis[j][i] = 10000000;
    }
  }
  for (int i = 1, a, b; i < n; i++) {
    scanf("%d%d", &a, &b);
    a--;
    b--;
    edge[a].push_back(b);
    edge[b].push_back(a);
    dis[a][b] = dis[b][a] = 1;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        dis[j][k] = std::min(dis[j][k], dis[j][i] + dis[i][k]);
      }
    }
  }
  dfs(0, -1);
  printf("%d\n", opt[0]);
  int w;
  for (w = 0; w < n; w++)
    if (dp[0][w] + k == opt[0]) break;
  print(0, -1, w);
  for (int i = 0; i < n; i++) printf("%d ", ans[i] + 1);
  return 0;
}
