#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=10005;
struct edge{
int u,v,w;
edge(int u,int v,int d):u(u),v(v),w(d){}
};
vector<edge> e;
vector<int> hn[maxn];
int n,m,b;
int cost[maxn];
int mcur;
int inq[maxn];
int d[maxn];
int vis[maxn];
void addEdge(int u,int v,int w){
e.push_back(edge(u,v,w));
hn[u].push_back(mcur);
hn[v].push_back(mcur);
mcur++;
}
int work(int c){
if(cost[1]>c){
return 0;
}
queue<int> Q;
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
memset(inq,0,sizeof(inq));
d[1]=0;
Q.push(1);
inq[1]=1;
while(!Q.empty()){
int u=Q.front();
Q.pop();
inq[u]=0;
vis[u]=1;
for(int i=0;i<hn[u].size();i++){
edge cure=e[hn[u][i]];
int v;
if(u!=cure.u){
v=cure.u;
}else{
v=cure.v;
}
if(cost[v]<=c&&d[v]>d[u]+cure.w){
d[v]=d[u]+cure.w;
if(inq[v]==0){
Q.push(v);
inq[v]=1;
}
}
}
}
return d[n]<=b?1:0;
}
int main(){
scanf("%d%d%d",&n,&m,&b);
int l=0x3f3f3f3f,r=0;
for(int i=1;i<=n;i++){
scanf("%d",&cost[i]);
l=min(l,cost[i]);
r=max(r,cost[i]);
}
mcur=0;
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addEdge(a,b,c);
}
while(l+1<r){
int mid=(l+r)/2;
if(work(mid)){
r=mid;
}else{
l=mid+1;
}
}
if(work(r)){
printf("%d",r);
}else if(work(l)){
printf("%d",l);
}else{
printf("AFK");
}
return 0;
}