/* Solution Author: Andrew Rayskiy Date: 29.04.2018 */ #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int N = 505, M = 350; mt19937 gen(time(NULL)); #define forn(i, n) for (int i = 0; i < n; i++) #define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr) #define all(a) (a).begin(), (a).end() #define pii pair #define mp make_pair #define endl '\n' typedef long long ll; template inline T read() { T val = 0, sign = 1; char ch; for (ch = getchar(); ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') sign = -1; for (; ch >= '0' && ch <= '9'; ch = getchar()) val = val * 10 + ch - '0'; return sign * val; } struct edge { int u, v, w; bool operator < (const edge &other) { return w < other.w; } }; struct dsu { vector p, gmin; ll tot = 0; dsu(int n) : p(vector(n + 1)) { iota(all(p), 0); } void init(vector &a) { gmin = a; tot = accumulate(all(gmin), (ll)0); } int get(int u) { return u == p[u] ? u : p[u] = get(p[u]); } void merge(int u, int v) { u = get(u), v = get(v); if (v == u) return; if (gmin[u] < gmin[v]) swap(u, v); tot -= gmin[u]; p[u] = v; } }; void solve() { int n = read(), m = read(); ll S = read(); vector a(n + 1); forn(i, n) a[i + 1] = read(); vector e; forn(i, m) { int u = read(), v = read(), w = read(); e.push_back({ u, v, w }); } sort(all(e)); auto T = dsu(n); T.init(a); if (T.tot <= S) printf("%d\n", 0); else { forn(i, m) { T.merge(e[i].u, e[i].v); if (T.tot <= S) { printf("%d\n", e[i].w); return; } } printf("%d\n", -1); } } void precalc() { } signed main() { int t = 1; precalc(); while (t--) { clock_t z = clock(); solve(); debug("Total Time: %.3f\n", (double)(clock() - z) / CLOCKS_PER_SEC); } }