#include <iostream>
#include <algorithm>
#include <array>
#include <functional>
#include <limits>
#include <queue>
#include <tuple>
#include <utility>
#include <vector>

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<long long> alts;
std::vector<std::pair<int, long long>> g[N];
std::array<bool, N> vis;
std::array<long long, N> dist;

void dijkstra(long long limit) {
    std::fill(vis.begin(), vis.end(), false);
    std::fill(dist.begin(), dist.end(), std::numeric_limits<long long>::max() / 3);

    std::priority_queue<std::pair<long long, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> 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;
}