a1071677765 @ 2019-07-11 14:33:10
#include <bits/stdc++.h>
using namespace std;
const long long inf=0x3fffffff;
struct node{
long long v,w,nxt;
}e[1000015];
struct qnode{
long long d,id;
};
bool operator < (const qnode &a,const qnode &b)
{
return a.d>b.d;
}
long long head[100015];
long long cnt=0;
long long d[100105];
long long vis[100015];
long long w[101005];
long long a[101005];
void add(long long u,long long v,long long w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
long long n,m,b;
long long x,y,z;
priority_queue<qnode>q;
bool check(long long x)
{
if(x<w[1]||x<w[n]) return 0;
for(int i=1;i<=n;i++) d[i]=inf;
d[1]=0;
qnode kk;
kk.id=1;
kk.d=0;
q.push(kk);
while(!q.empty())
{
qnode s=q.top();
q.pop();
if(d[s.id]!=s.d) continue;
for(int i=head[s.id];i;i=e[i].nxt)
{
int v=e[i].v;
if(d[v]>d[s.id]+e[i].w&&w[v]<=x)
{
d[v]=d[s.id]+e[i].w;
qnode c;
c.d=d[v];
c.id=v;
q.push(c);
}
}
}
return d[n]<=b;
}
int main(){
cin >> n >> m >> b;
long long ma=-1;
for(long long i=1;i<=n;i++)
{
scanf("%lld",&w[i]);
ma=max(ma,w[i]);
}
for(long long i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
if(x==y) continue;
add(x,y,z);
add(y,z,x);
}
long long ans=-1;
long long l=1,r=ma;
while(l<=r)
{
long long mid=(l+r)/2;
if(check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
if(ans==-1) printf("AFK\n");
printf("%lld\n",ans);
return 0;
}