#include <bits/stdc++.h>
#define ll long long
#define N 200001
#define mod 998244353
#define all(a) a.begin(),a.end()
#define uniqueu(a) a.erase(unique(all(a)), a.end())
using namespace std;
mt19937_64 mrand(random_device{}());
struct Edge {
int w, v;
Edge (int w_, int v_) {
w = w_; v = v_;
}
};
struct Info {
int id, w;
bool operator < (const Info &A) const {
return A.w < w;
}
};
vector<Edge> edges[N];
int n, m, k;
ll f[N], dist[N];
bool b[N];
bool check(ll p) {
priority_queue<Info> q;
memset(dist, 127, sizeof(dist));
q.push((Info){1, 0});
dist[1] = 0;
for ( ; !q.empty(); ) {
auto x = q.top();
q.pop();
int u = x.id;
if (dist[u] != x.w)
continue;
for (auto &i : edges[u])
if (f[i.w] <= p && dist[i.w] > dist[u] + i.v) {
dist[i.w] = dist[u] + i.v;
q.push((Info){i.w, dist[i.w]});
}
}
return dist[n] <= k;
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++)
scanf("%lld", &f[i]);
for (int i = 1; i <= m; i++) {
int x, y; ll v;
scanf("%d%d%lld", &x, &y, &v);
edges[x].push_back(Edge(y, v));
edges[y].push_back(Edge(x, v));
}
if (!check(1000000001)) {
puts("AFK");
return 0;
}
ll L = 0, R = 1e18 + 1;
for ( ; L + 1 < R; ) {
ll Mid = (L + R) / 2;
if (!check(Mid))
L = Mid;
else
R = Mid;
}
if (!check(R))
puts("AFK");
else
printf("%lld\n", R);
}