ztz_cpp @ 2019-08-02 16:30:58
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
const int maxm=5e4+10;
const int inf=2e9+10;
int n,m,b;
int ans;
int f[maxn];
int s[maxn];
priority_queue<pair<int,int> >q;
int dis[maxn];
bool vis[maxn];
struct edge{
int next,to,v;
}e[maxm<<1];
int head[maxn],tot;
void add(int x,int y,int z){
tot++;
e[tot].next=head[x];
e[tot].to=y;
e[tot].v=z;
head[x]=tot;
}
bool ok(int ss){
if(ss<f[1] || ss<f[n])
return 0;
for(register int i=1;i<=n;i++)
dis[i]=inf;
for(register int i=1;i<=n;i++)
if(f[i]>ss)
vis[i]=1;
else
vis[i]=0;
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x])
continue;
vis[x]=1;
for(register int i=head[x];i;i=e[i].next){
int y=e[i].to;
int z=e[i].v;
if(dis[y]>dis[x]+z){
dis[y]=dis[x]+z;
q.push(make_pair(-dis[y],y));
}
}
}
if(dis[n]<=b)
return 1;
else
return 0;
}
int main(){
int x,y,z;
scanf("%d%d%d",&n,&m,&b);
for(register int i=1;i<=n;i++){
scanf("%d",&f[i]);
s[i]=f[i];
}
for(register int i=1;i<=n;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
sort(s+1,s+n+1);
if(!ok(s[n]))
puts("AFK");
else{
ans=n;
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(ok(s[mid])){
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%d\n",s[ans]);
}
return 0;
}