#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const int maxn = 3e5 + 10;
const int INF = 0x3f3f3f3f;
struct edge {
  int from, to;
  long long w;
  edge() {}
  edge(int from, int to, long long w) : from(from), to(to), w(w) {}
};
vector<edge> e;
vector<vector<int> > g(maxn);
vector<long long> dist_n, dist_1;
vector<pair<long long, int> > rk;
int pos[maxn];
void addedge(int from, int to, long long w) {
  e.push_back(edge(from, to, w));
  e.push_back(edge(to, from, w));
  int m = e.size();
  g[from].push_back(m - 2);
  g[to].push_back(m - 1);
}
void dfs(vector<long long>& d, int o, int p, long long w) {
  d[o] = w;
  for (auto& u : g[o]) {
    edge temp = e[u];
    if (temp.to != p) dfs(d, temp.to, o, w + temp.w);
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  dist_n.resize(n + 1);
  dist_1.resize(n + 1);
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    long long w;
    scanf("%d%d%lld", &a, &b, &w);
    addedge(a, b, w);
  }
  dfs(dist_1, 1, -1, 0);
  dfs(dist_n, n, -1, 0);
  for (int i = 1; i <= n; i++)
    rk.push_back(make_pair(dist_1[i] - dist_n[i], i));
  sort(rk.begin(), rk.end());
  for (int i = 0; i < n; i++) pos[rk[i].second] = i;
  set<pair<long long, int> > s;
  for (int i = 1; i <= n; i++) s.insert(make_pair(dist_n[i], i));
  long long T = 0;
  for (int i = 0; i < n; i++) {
    int v = rk[i].second;
    s.erase(make_pair(dist_n[v], v));
    for (auto& u : g[v]) {
      edge& temp = e[u];
      if (pos[temp.to] > pos[v]) s.erase(make_pair(dist_n[temp.to], temp.to));
    }
    if (!s.empty()) {
      T = max(T, dist_1[v] + s.rbegin()->first);
    }
    for (auto& u : g[v]) {
      edge& temp = e[u];
      if (pos[temp.to] > pos[v]) s.insert(make_pair(dist_n[temp.to], temp.to));
    }
  }
  while (m--) {
    int x;
    scanf("%d", &x);
    printf("%lld\n", min(dist_n[1], 1ll * x + T));
  }
  return 0;
}
