#5 #8 和hack点没过 感谢好人~
#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct node{
int point,dist;
bool operator > (const node &A) const{return dist>A.dist;};
};
struct edge{int v,w;};
int n,m,s=1,b,u,v,w,dis[N],cost[N],h;
vector<edge> vt[N];
bool vis[N];
priority_queue<node,vector<node>,greater<node> >q;
bool dij(int wt){
if(cost[1]>wt)return false;
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
q.push({s,0});
dis[s]=0;
while(!q.empty()){
u=q.top().point ; q.pop();
if(vis[u])continue;
vis[u]=1;
if(cost[u]>wt)continue;
for(int i=0;i<vt[u].size();i++){
v=vt[u][i].v,w=vt[u][i].w;
if(cost[v]>wt)continue;
if(b>dis[u]+w){
dis[v]=dis[u]+w;
q.push({v,dis[v]});
}
}
}
if(dis[n]<=b)return true;
return false;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>b;
for(int i=1;i<=n;i++){
cin>>cost[i];h=max(h,cost[i]);
}
while (m--){
cin>>u>>v>>w;
vt[u].push_back({v,w});
}
if(!dij(h))cout<<"AFK";
else{
int l=0,r=h,mid,ans;
while(l<=r){
mid=l+(r-l)/2;
if(dij(mid))ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans;
}
return 0;
}