#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  char c;
  bool nega = 0;
  while ((!isdigit(c = getchar())) && (c != '-'))
    ;
  if (c == '-') {
    nega = 1;
    c = getchar();
  }
  x = c - 48;
  while (isdigit(c = getchar())) x = x * 10 + c - 48;
  if (nega) x = -x;
}
template <typename T>
inline void writep(T x) {
  if (x > 9) writep(x / 10);
  putchar(x % 10 + 48);
}
template <typename T>
inline void write(T x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  writep(x);
}
template <typename T>
inline void writeln(T x) {
  write(x);
  putchar('\n');
}
int n, m;
vector<pair<int, long long> > g[300001];
bool done[300001];
bool sp[300001];
long long d0[300001];
long long d1[300001];
vector<int> path;
void dfs0(long long u) {
  done[u] = 1;
  if (u == n) sp[u] = 1;
  for (pair<int, long long> v : g[u])
    if (!done[v.first]) {
      d0[v.first] = d0[u] + v.second;
      dfs0(v.first);
      sp[u] = sp[u] || sp[v.first];
    }
  if (sp[u]) path.push_back(u);
}
void dfs1(long long u) {
  done[u] = 1;
  for (pair<int, long long> v : g[u])
    if (!done[v.first]) {
      d1[v.first] = d1[u] + v.second;
      dfs1(v.first);
    }
}
long long res = 0;
long long expand0(int u) {
  long long res = d0[u];
  done[u] = 1;
  for (pair<int, long long> v : g[u])
    if (!sp[v.first])
      if (!done[v.first]) res = max(res, expand0(v.first));
  return res;
}
long long expand1(int u) {
  long long res = d1[u];
  done[u] = 1;
  for (pair<int, long long> v : g[u])
    if (!sp[v.first])
      if (!done[v.first]) res = max(res, expand1(v.first));
  return res;
}
bool expand(int u) {
  int deg = 0;
  done[u] = 1;
  bool d = 0;
  for (pair<int, long long> v : g[u])
    if (!sp[v.first]) {
      if (u == 1 && v.first == n) continue;
      if (u == n && v.first == 1) continue;
      deg++;
      if ((v.first == 1) || (v.first == n)) {
        if (d == 1) deg--;
        d = 1;
      }
    }
  if (deg > 1) return 1;
  for (pair<int, long long> v : g[u])
    if (!sp[v.first])
      if (!done[v.first]) return expand(v.first);
  return 0;
}
vector<long long> good;
int main() {
  read(n);
  read(m);
  {
    long long u, v, w;
    for (int i = (1); i < (n); i++) {
      read(u);
      read(v);
      read(w);
      g[u].push_back(make_pair(v, w));
      g[v].push_back(make_pair(u, w));
    }
  }
  dfs0(1);
  for (int i = (1); i <= (n); i++) done[i] = 0;
  dfs1(n);
  for (int i = (1); i <= (n); i++) done[i] = 0;
  sp[1] = sp[n] = 0;
  bool alwaybest = expand(1) || expand(n);
  if (alwaybest)
    res = 1e18;
  else {
    sp[1] = sp[n] = 1;
    path.push_back(0);
    reverse(path.begin(), path.end());
    good.push_back(-1e18);
    for (int i = (1); i <= (n); i++) done[i] = 0;
    for (int i = (1); i < (path.size()); i++) {
      good.push_back(good[i - 1]);
      if (i > 1) good.back() = max(good.back(), d0[path[i - 1]]);
      for (pair<int, long long> v : g[path[i]])
        if (!sp[v.first]) good.back() = max(good.back(), expand0(v.first));
    }
    long long best = -1e18;
    for (int i = (1); i <= (n); i++) done[i] = 0;
    for (int i = (path.size() - 1); i >= (2); i--) {
      for (pair<int, long long> v : g[path[i]])
        if (!sp[v.first]) best = max(best, expand1(v.first));
      res = max(res, best + max(good[i - 1], d0[path[i - 1]]));
      best = max(best, d1[path[i]]);
      res = max(res, best + good[i - 1]);
    }
  }
  {
    long long x;
    for (int i = (1); i <= (m); i++) {
      read(x);
      writeln(min(d0[n], x + res));
    }
  }
}
