#include <bits/stdc++.h>   using namespace std;   using namespace std::chrono;   template <typename A>   ostream &operator<<(ostream &cout, vector<A> const &v);   template <typename A, typename B>   ostream &operator<<(ostream &cout, pair<A, B> const &p) {     return cout <<  (  << p.first <<  ,   << p.second <<  ) ;   }   template <typename A>   ostream &operator<<(ostream &cout, vector<A> const &v) {     cout <<  [ ;     for (int i = 0; i < v.size(); i++) {       if (i) cout <<  ,  ;       cout << v[i];     }     return cout <<  ] ;   }   template <typename A, typename B>   istream &operator>>(istream &cin, pair<A, B> &p) {     cin >> p.first;     return cin >> p.second;   }   mt19937 rng(steady_clock::now().time_since_epoch().count());   void usaco(string filename) {     freopen((filename +  .in ).c_str(),  r , stdin);     freopen((filename +  .out ).c_str(),  w , stdout);   }   const long double pi = 3.14159265358979323846;   const long long mod = 998244353;   long long n, m, k, q, Q, T, l, r, x, y, z;   long long a[1000005];   long long b[1000005];   long long c[1000005];   string second, t;   long long ans = -mod * mod;   vector<pair<long long, long long> > edges[300005];   long long dis[300005];   long long bfirst[300005];   long long blast[300005];   bool has[300005];   vector<long long> res;   void dfs1(int v, int p, long long d) {     dis[v] = d;     for (pair<long long, long long> x : edges[v])       if (x.first != p) dfs1(x.first, v, d + x.second);   }   long long why, why2;   long long why3 = -mod * mod;   bool dfs2(int v, int p, long long d, long long d2) {     if (v == n - 1) {       why = d2;       why2 = p;       return has[v] = 1;     }     bfirst[v] = d;     blast[v] = dis[v];     int targ = -1;     ans = max(ans, d + why3);     for (pair<long long, long long> x : edges[v])       if (x.first != p) {         has[v] |= dfs2(x.first, v, d + x.second, d);         bfirst[v] = max(bfirst[v], bfirst[x.first]);         blast[v] = max(blast[v], blast[x.first]);         if (has[x.first]) {           targ = x.first;           res.push_back(x.second);         }       }     if (has[v]) {       for (pair<long long, long long> x : edges[v])         if (x.first != p && x.first != targ) {           long long va = bfirst[x.first] + blast[targ];           ans = max(ans, va);           ans = max(ans, blast[x.first] + d2);         }     }     return has[v];   }   int cc = 0;   void dfs3(int v, int p, long long d) {     if (v != n - 1) ans = max(ans, why + d);     ++cc;     if (v != n - 1) why3 = max(why3, d);     for (pair<long long, long long> x : edges[v])       if (x.first != p) dfs3(x.first, v, d + x.second);   }   bool first = 0;   void dfs4(int v, int p) {     for (pair<long long, long long> x : edges[v])       if (x.first != p) {         if (p != -1 && !has[v]) first = 1;         dfs4(x.first, v);       }   }   int main() {     {       ios_base::sync_with_stdio(false);       cin.tie(NULL);       cout.tie(NULL);     };     cin >> n >> m;     for (long long i = 0; i < (n - 1); i++) {       cin >> x >> y >> z;       --x;       --y;       edges[x].push_back(make_pair(y, z));       edges[y].push_back(make_pair(x, z));     }     dfs1(n - 1, -1, 0);     memset(bfirst, 0, sizeof(bfirst));     memset(blast, 0, sizeof(blast));     dfs2(0, -1, 0, -mod * mod);     for (long long i = 0; i < (res.size() - 1); i++)       ans = max(ans, dis[0] - res[i] - res[i + 1]);     dfs3(n - 1, why2, 0);     dfs2(0, -1, 0, -mod * mod);     if (cc > 2) first = 1;     dfs4(0, -1);     for (long long i = 0; i < (m); i++) {       cin >> x;       cout << (first ? dis[0] : min(ans + x, dis[0])) <<   n ;     }   }