//555为什么过不了昂
#include<bits/stdc++.h>
using namespace std;
const int INF=1000000000+10;
const int maxn=10000+10;
const int maxm=50000+10;
struct node
{
int u,v,w,next;
}e[maxm<<1];
int n,m,hb,id=0;
int b[maxn],c[maxn];
int head[maxm<<1],d[maxn];
bool vis[maxn];
priority_queue<int,vector<int>,greater<int> >q;//小根堆
void add(int x,int y,int t)
{
id++;
e[id].u=x;
e[id].v=y;
e[id].w=t;
e[id].next=head[x];
head[x]=id;
return;
}
bool check(int x)
{
if(x<b[1]||x<b[n])return false;
for(int i=1;i<=n;i++)d[i]=INF;
for(int j=1;j<=n;j++)
if(b[j]>x)vis[j]=true;
else vis[j]=false;
d[1]=0;q.push(1);
while(!q.empty()){
int now=q.top();
q.pop();
if(vis[now])continue;
vis[now]=true;
for(int i=head[now];i;i=e[i].next)
if(d[e[i].v]>e[i].w+d[now]){
d[e[i].v]=e[i].w+d[now];
q.push(e[i].v);}}
if(d[n]<=hb)return true;
else return false;}
int main()
{
int j,k,t,ans,maxx=0;
cin>>n>>m>>hb;
for(int i=1;i<=n;i++){
cin>>b[i];
c[i]=b[i];}
for(int i=1;i<=m;i++){
cin>>j>>k>>t;
if(j==k)continue;
add(j,k,t);
add(k,j,t);}
sort(c+1,c+n+1);
int l=1,r=n,mid;
if(!check(c[n])){
cout<<"AFK"<<endl;
return 0;
}
ans=c[n];
while(l<=r)
{
mid=(l+r)>>1;
if(check(c[mid]))
{
ans=c[mid];
r=mid-1;
}
else l=mid+1;}
cout<<ans;
return 0;
}//收工收工,改天复习一下
//前提是把这道题的点过了啊...