#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4 + 5;
inline bool isdig(char c){return '0' <= c && c <= '9';}
inline ll read(){
ll x = 0 ,f = 1;
char c = getchar();
while (!isdig(c)){
if (c == '-') f = -1;
c = getchar();
}
while(isdig(c)){
x = (x << 3) + (x << 1) + c - '0';
c = getchar();
}
return x * f;
}
inline void write(ll x){
if (x < 0){
x = -x;
putchar('-');
}
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
ll a[N],c[N];
struct Node{
ll v , val;
Node(){}
Node(ll v , ll val):v(v),val(val){}
bool operator < (const Node & A) const{
return val > A.val;
};
};
struct Edge{
ll u , v , w;
Edge(){}
Edge(ll u , ll v , ll w):u(u),v(v),w(w){}
};
ll b;
vector <Edge> e;
priority_queue <Node> q;
vector <Node> G[N];
bool vis[N];
ll dis[N], fl;
bool Dijkstra(ll s,ll n,ll x){
for (int i = 1 ; i <= n ; i ++) dis[i] = 0x3f3f3f3f3f3f3f3f , vis[i] = 0;
while (!q.empty()) q.pop();
dis[s] = 0ll;
vis[s] = 1;
q.push(Node(s , 0ll));
while (!q.empty()){
Node t = q.top();q.pop();
ll u = t.v;
if (dis[u] > b) continue;
for (int i = 0 ; i < G[u].size() ; i ++){
ll v = G[u][i].v , w = G[u][i].val;
if (c[v] > x) continue;
if (dis[u] + w < dis[v]){
dis[v] = dis[u] + w;
if (!vis[v]) {
q.push(Node(v , dis[v]));
vis[v] = 1;
}
}
}
}
if (dis[n] == 0x3f3f3f3f3f3f3f3f) return false;
return true;
}
bool check(ll x,ll n){return Dijkstra(1 , n , x);}
int main(){
ll n = read() , m = read();
b = read();
for (int i = 1 ; i <= n ;i ++) a[i] = read(),c[i] = a[i];
for (int i = 1 ; i <= m ; i ++){
ll u = read() , v = read() , w = read();
G[u].push_back(Node(v , w));
G[v].push_back(Node(u , w));
}
sort(a + 1 , a + n + 1);
ll l = 1 , r = n,ans = -1;
while (l <= r){
int mid = l + r >> 1;
if (check(a[mid] , n)) ans = a[mid] , r = mid - 1;
else l = mid + 1;
}
if (ans == -1) return puts("AFK"),0;
write(max(c[1],ans));
putchar('\n');
return 0;
}