#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,b,l,r,mid;
int cnt;
const int N=5e4+5,inf=1e15;
struct edge
{
int from,to,nxt,val;
}g[N];
int d[N],h[N],f[N];
void add(int u,int v,int w)
{
g[++cnt].from=u;
g[cnt].to=v;
g[cnt].nxt=h[u];
g[cnt].val=w;
h[u]=cnt;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
void dij(int maxn)
{
for (int i=1;i<=n;i++)
{
d[i]=inf;
}
d[1]=0;
q.push({0,1});
while(!q.empty())
{
int u=q.top().second;
q.pop();
for (int i=h[u];~i;i=g[i].nxt)
{
int v=g[i].to;
int len=g[i].val;
if (f[v]>maxn)
{
continue ;
}
if (d[u]+len<d[v])
{
d[v]=d[u]+len;
q.push({d[v],v});
}
}
}
}
signed main()
{
cin>>n>>m>>b;
for (int i=1;i<=n;i++)
{
h[i]=-1;
cin>>f[i];
r=max(r,f[i]);
}
l=max(f[1],f[n]);
for (int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
while(l<r)
{
mid=(l+r)/2;
dij(mid);
if (d[n]>b)
l=mid+1;
else
r=mid;
}
dij(l);
if (d[n]>b) cout<<"AFK";
else cout<<l;
return 0;
}