#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10010,M=50010;
struct inf{
int a,b,c;
}t[M];
struct edge{
int v,w;
};
vector<edge>e[N][35];
int n,m,b,cnt,l,r,f[N];
ll d[N];
bool vis[N];
ll dijkstra()
{
priority_queue<pair<int,int>>q;
for(int i=1;i<=n;i++) d[i]=1e18,vis[i]=0;
d[1]=0;
q.push({0,1});
while(q.size())
{
auto t=q.top();
q.pop();
int u=t.second;
if(vis[u]) continue;
vis[u]=1;
for(auto ed:e[u][cnt])
{
int v=ed.v,w=ed.w;
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
q.push({-d[v],v});
}
}
}
return d[n];
}
int main()
{
cin>>n>>m>>b;
for(int i=1;i<=n;i++)
{
cin>>f[i];
r=max(r,f[i]);
}
l=max(f[1],f[n]);
for(int i=1;i<=m;i++)
{
cin>>t[i].a>>t[i].b>>t[i].c;
e[t[i].a][0].push_back({t[i].b,t[i].c});
e[t[i].b][0].push_back({t[i].a,t[i].c});
}
if(dijkstra()>b)
{
cout<<"AFK";
return 0;
}
while(l<r)
{
cnt++;
int mid=l+r>>1;
for(int i=1;i<=m;i++)
{
e[t[i].a][cnt].push_back({t[i].b,t[i].c});
e[t[i].b][cnt].push_back({t[i].a,t[i].c});
}
if(dijkstra()<=b) r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}