#include<bits/stdc++.h>
#define maxn 10005
#define maxm 50005
#define maxb 1000000005
#define int long long
using namespace std;
int n,m,b,f[maxn],head[maxn],dis[maxn],cnt;
bool vis[maxn];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
struct node{
int next,to,w;
}edge[maxm<<1];
void addedge(int u,int v,int w){
edge[cnt++].next=head[u];
edge[cnt].to=v;
edge[cnt].w=w;
head[u]=cnt;
}
bool check(int x){
if(x<f[1]){return 0;}
for(int i=1;i<=n;i++){
dis[i]=1e9;
vis[i]=0;
}
dis[1]=0;
q.push(make_pair(0,1));
while(q.size()){
int u=q.top().second;
q.pop();
if(!vis[u]){
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(f[v]<=x && dis[v]>dis[u]+edge[i].w){
dis[v]=dis[u]+edge[i].w;
if(!vis[v]){
q.push(make_pair(dis[v],v));
}
}
}
}
}
return dis[n]<=b;
}
signed main(){
cin >> n >> m >> b;
for(int i=1;i<=n;i++){
cin >> f[i];
}
for(int i=1;i<=m;i++){
int a,b,c;
cin >> a >> b >> c;
addedge(a,b,c);
addedge(b,a,c);
}
if(!check(maxb)){
cout << "AFK";
return 0;
}
int l=1,r=maxb;
while(l<=r){
int mid=l+r>>1;
if(check(mid)){
r=mid-1;
}else{
l=mid+1;
}
}
cout << l;
}