#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_;
}
};
vector<Edge> e[N];
int n, m, k;
ll f[N], dist[N];
bool b[N];
bool spfa(ll p) {
memset(b, false, sizeof(b));
for (int i = 1; i <= n; i++)
dist[i] = INT_MAX;
queue<int> que;
que.push(1), b[1] = true, dist[1] = 0;
for ( ; !que.empty(); ) {
int x = que.front();
que.pop(); b[x] = false;
for (auto &i : e[x])
if (dist[i.w] > dist[x] + i.v && f[i.w] <= p) {
dist[i.w] = dist[x] + i.v;
if (!b[i.w]) {
b[i.w] = true;
que.push(i.w);
}
}
}
if (dist[n] >= k)
return false;
return true;
}
int main() {
scanf("%d%d%d", &n, &m, &k);
ll L = 0, R = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld", &f[i]);
R = max(R, f[i]);
}
for (int i = 1; i <= m; i++) {
int x, y; ll v;
scanf("%d%d%lld", &x, &y, &v);
if (x == y)
continue;
e[x].push_back(Edge(y, v));
e[y].push_back(Edge(x, v));
}
if (!spfa(1000000001)) {
puts("AFK");
return 0;
}
for ( ; L + 1 < R; ) {
ll Mid = (L + R) / 2;
if (!spfa(Mid))
L = Mid;
else
R = Mid;
}
if (!spfa(R))
puts("AFK");
else
printf("%lld\n", R);
}