#include <bits/stdc++.h>
using namespace std;
struct edge {
  int to, w;
};
struct Node {
  int u;
  long long val;
};
const int N = 3e5 + 10;
const long long INF = 1e18;
vector<edge> G[N];
long long d[N], dn[N];
int pos[N];
int n;
Node a[N], b[N];
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    pq;
set<Node> s;
void dijkstra1() {
  while (!pq.empty()) pq.pop();
  fill(d + 1, d + n + 1, INF);
  d[1] = 0;
  pq.push(pair<int, int>(0, 1));
  while (!pq.empty()) {
    pair<int, int> p = pq.top();
    pq.pop();
    int v = p.second;
    if (d[v] < p.first) continue;
    for (int i = 0; i < G[v].size(); i++) {
      edge e = G[v][i];
      if (d[e.to] > d[v] + e.w) {
        d[e.to] = d[v] + e.w;
        pq.push(pair<int, int>(d[e.to], e.to));
      }
    }
  }
}
void dijkstran() {
  while (!pq.empty()) pq.pop();
  fill(dn + 1, dn + n + 1, INF);
  dn[n] = 0;
  pq.push(pair<int, int>(0, n));
  while (!pq.empty()) {
    pair<int, int> p = pq.top();
    pq.pop();
    int v = p.second;
    if (dn[v] < p.first) continue;
    for (int i = 0; i < G[v].size(); i++) {
      edge e = G[v][i];
      if (dn[e.to] > dn[v] + e.w) {
        dn[e.to] = dn[v] + e.w;
        pq.push(pair<int, int>(dn[e.to], e.to));
      }
    }
  }
}
bool cmp(const Node& x, const Node& y) { return x.val < y.val; }
bool operator<(Node x, Node y) {
  if (x.val == y.val) return x.u < y.u;
  return x.val > y.val;
}
int main() {
  int q, u, v, w;
  long long maxx;
  scanf("%d %d", &n, &q);
  for (int i = 1; i <= n - 1; i++) {
    scanf("%d %d %d", &u, &v, &w);
    G[u].push_back((edge){v, w});
    G[v].push_back((edge){u, w});
  }
  dijkstra1();
  dijkstran();
  for (int i = 1; i <= n; i++) {
    a[i].val = d[i] - dn[i];
    a[i].u = i;
    b[i].val = dn[i];
    b[i].u = i;
    s.insert(b[i]);
  }
  sort(a + 1, a + n + 1, cmp);
  for (int i = 1; i <= n; i++) pos[a[i].u] = i;
  maxx = 0;
  for (int i = 1; i <= n; i++) {
    u = a[i].u;
    s.erase(b[u]);
    for (int j = 0; j < G[u].size(); j++) s.erase(b[G[u][j].to]);
    if (!s.empty()) maxx = max(maxx, d[u] + s.begin()->val);
    for (int j = 0; j < G[u].size(); j++) {
      if (pos[G[u][j].to] > pos[u]) s.insert(b[G[u][j].to]);
    }
  }
  for (int i = 1; i <= q; i++) {
    scanf("%d", &w);
    printf("%I64d\n", min(d[n], maxx + w));
  }
  return 0;
}
