#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const int MOD = 1e9 + 7;
const int N = 5e5 + 5;
vector<int> adj[N], cost[N];
int n, m;
vector<long long> dij(int start) {
  vector<long long> dist(n + 1, INF);
  dist[start] = 0;
  vector<bool> visited(n + 1);
  priority_queue<pair<long long, int> > pq;
  pq.push({0, start});
  while (!pq.empty()) {
    int u = pq.top().second;
    pq.pop();
    if (visited[u]) continue;
    visited[u] = true;
    for (int i = 0; i < adj[u].size(); ++i) {
      int v = adj[u][i];
      long long nc = dist[u] + cost[u][i];
      if (!visited[v] && nc < dist[v]) {
        dist[v] = min(nc, dist[v]);
        pq.push({-dist[v], v});
      }
    }
  }
  return dist;
}
int main() {
  cin >> n >> m;
  map<pair<int, int>, bool> has_edge;
  for (int i = 0; i < n - 1; ++i) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    adj[a].push_back(b);
    adj[b].push_back(a);
    cost[a].push_back(c);
    cost[b].push_back(c);
    has_edge[make_pair(a, b)] = true;
    has_edge[make_pair(b, a)] = true;
  }
  auto d1 = dij(1);
  auto d2 = dij(n);
  long long worst = d1[n];
  vector<pair<long long, int> > order;
  for (int i = 1; i <= n; ++i) order.push_back({d1[i] - d2[i], i});
  sort((order).begin(), (order).end());
  set<pair<long long, int> > choice;
  long long best = 0;
  for (int i = 0; i < n; ++i) {
    int u = order[i].second;
    auto it = choice.begin();
    while (it != choice.end() && has_edge[make_pair(u, it->second)]) ++it;
    if (it != choice.end()) best = max(best, d2[u] - it->first);
    choice.insert({-d1[u], u});
  }
  while (m--) {
    int x;
    scanf("%d", &x);
    printf("%lld\n", min(x + best, worst));
  }
}
