#include #include #include #include #include #include #include #include #include using std::cin; using std::cout; const char endl = '\n'; const int N = 1e5 + 5; int n, m; long long s, alt[N]; std::vector alts; std::vector> g[N]; std::array vis; std::array dist; void dijkstra(long long limit) { std::fill(vis.begin(), vis.end(), false); std::fill(dist.begin(), dist.end(), std::numeric_limits::max() / 3); std::priority_queue, std::vector>, std::greater>> q; q.emplace(0, 1); dist[1] = 0; while (!q.empty()) { int u = q.top().second; q.pop(); if (vis[u]) continue; vis[u] = true; for (auto e : g[u]) { int v = e.first; long long w = e.second; if (dist[v] > dist[u] + w && alt[v] - alt[u] <= limit) { dist[v] = dist[u] + w; q.emplace(dist[v], v); } } } } bool check(int x) { dijkstra(alts[x]); return dist[n] <= s; } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> s; for (int i = 1; i <= n; i++) { cin >> alt[i]; } for (int i = 1; i <= m; i++) { int u, v; long long w; cin >> u >> v >> w; g[u].emplace_back(v, w); alts.emplace_back(alt[v] - alt[u]); g[v].emplace_back(u, w); alts.emplace_back(alt[u] - alt[v]); } std::sort(alts.begin(), alts.end()); alts.erase(std::unique(alts.begin(), alts.end()), alts.end()); int l = 0, r = alts.size() - 1, res = alts.size(); while (l <= r) { int mid = l + r >> 1; if (check(mid)) { r = mid - 1; res = mid; } else { l = mid + 1; } } if (res == alts.size()) { cout << "NO" << endl; } else { cout << alts[res] << endl; } return 0; }