func_code_string: #include <bits/stdc++.h>   using namespace std;   int inf = (1 << 30) - 1, n, X, x, y, z, f[510][510], c[510], R, g[510][510],       size[510], h[2][510], H[2][510][510], q[510], L[510];   int Lng[510];   double a[510][510];   vector<int> E[510];   void read(int &x) {     char ch = getchar();     int mark = 1;     for (; ch !=  -  && (ch <  0  || ch >  9 ); ch = getchar())       ;     if (ch ==  - ) mark = -1, ch = getchar();     for (x = 0; ch >=  0  && ch <=  9 ; ch = getchar()) x = x * 10 + ch - 48;     x *= mark;   }   double Solve(int m, int n) {     bool flag = 1;     for (; flag;) {       flag = 0;       for (int i = 1; i <= n; i++)         if (a[0][i] > 0) {           double Min = inf;           int l;           for (int j = 1; j <= m; j++)             if (a[j][i] < 0) {               double tmp = -a[j][0] / a[j][i];               if (Min > tmp) Min = tmp, l = j;             }           if (Min == inf) continue;           flag = 1;           double tmp = -a[l][i];           a[l][i] = -1;           for (int j = 0; j <= n; j++) a[l][j] /= tmp;           for (int j = 0; j <= m; j++)             if (a[j][i] && j != l) {               for (int k = 0; k <= n; k++)                 if (k != i) a[j][k] += a[j][i] * a[l][k];               a[j][i] *= a[l][i];             }         }     }     return a[0][0];   }   void dfs(int u, int pre) {     int cnt = 0;     for (int i = 0; i < E[u].size(); i++)       if (E[u][i] != pre) {         dfs(E[u][i], u);         ++cnt;         Lng[u] = max(Lng[u], min(Lng[E[u][i]] + f[u][E[u][i]], inf));       }     size[u] = 1;     int A = 0;     for (int j = 0; j <= R; j++) h[A][j] = inf;     for (int Bg = 0; Bg <= cnt; Bg++)       for (int j = 0; j <= R; j++) H[A][Bg][j] = inf;     H[A][0][0] = inf - 1;     h[A][1] = 0;     cnt = 0;     L[0] = -inf;     for (int i = 0; i < E[u].size(); i++)       if (E[u][i] != pre) {         int v = E[u][i];         q[++cnt] = v;         L[cnt] = min(inf, f[u][v] + Lng[v]);         A ^= 1;         for (int j = 0; j <= R; j++) h[A][j] = inf;         for (int Bg = 0; Bg <= cnt; Bg++)           for (int j = 0; j <= R; j++) H[A][Bg][j] = inf;         for (int k = 0; k <= size[u] && k <= R; k++)           for (int j = 0; j <= size[v] && j + k <= R; j++) {             if (j == 0 && max(h[A ^ 1][k], Lng[v] + f[u][v]) <= X)               h[A][j + k] = 0;             if (j && g[v][j] != inf &&                 max(h[A ^ 1][k], min(g[v][j], f[u][v])) <= X)               h[A][j + k] = 0;           }         for (int Bg = 0; Bg < cnt; Bg++)           for (int k = 0; k <= size[u] && k <= R; k++)             if (H[A ^ 1][Bg][k] != inf) {               for (int j = 1; j + k <= R && j <= size[v]; j++)                 if (g[v][j] <= X)                   H[A][Bg][j + k] = min(H[A][Bg][j + k],                                         min(H[A ^ 1][Bg][k], g[v][j] + f[u][v]));               if (L[cnt] > L[Bg])                 H[A][cnt][k] = min(H[A][cnt][k], H[A ^ 1][Bg][k]);               else                 H[A][Bg][k] = min(H[A][Bg][k], H[A ^ 1][Bg][k]);             }         size[u] += size[v];       }     for (int j = 0; j <= R; j++) g[u][j] = h[A][j];     for (int Bg = 0; Bg <= cnt; Bg++)       for (int j = 0; j <= R; j++)         if (H[A][Bg][j] + L[Bg] <= X) g[u][j] = min(g[u][j], H[A][Bg][j]);   }   bool check() {     for (int i = 1; i <= n; i++)       for (int j = 0; j <= n; j++) g[i][j] = inf;     dfs(1, 0);     return (g[1][R] <= X);   }   int main() {     read(n);     read(X);     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) f[i][j] = inf;       f[i][i] = 0;       read(c[i]);       R += c[i];     }     for (int i = 1; i < n; i++) {       read(x);       read(y);       read(z);       f[x][y] = f[y][x] = z;       E[x].push_back(y);       E[y].push_back(x);     }     for (int k = 1; k <= n; k++)       for (int i = 1; i <= n; i++)         if (i ^ k)           for (int j = 1; j <= n; j++)             if ((i ^ j) && (k ^ j)) f[i][j] = min(f[i][k] + f[k][j], f[i][j]);     if (!check()) {       printf( -1 n );       return 0;     }     a[0][n + 1] = -R;     for (int i = 1; i <= n; i++) {       a[0][i] = 1;       a[i][n + 1] = 1;       a[i][0] = c[i] ^ 1;       for (int j = 1; j <= n; j++) a[i][j] = -(f[i][j] <= X);     }     printf( %.0lf n , Solve(n, n + 1));     return 0;   }   