return_CE @ 2022-10-04 18:14:09
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,cnt;
int f[10010],ans,h[10010];
ll b;
bool v[10010];
struct point
{
int nex,to;
ll pre;
}edg[100020];
priority_queue <pair <ll,int> > q;
int dis[10010];
bool check(int p)
{
if(p<f[1])return 0;
while(!q.empty())q.pop();
memset(dis,0x7f7f7f,sizeof(dis));
memset(v,0,sizeof(v));
dis[1]=0;v[1]=1;
q.push(make_pair(-dis[1],1));
int root=1;
for(int i=1;i<n;i++)
{
if(v[n])break;
for(int j=h[root];j;j=edg[j].nex )
{
int x=edg[j].to;
if(f[x]>p||v[x])continue;
if(dis[root]+edg[j].pre<dis[x])
{
dis[x]=dis[root]+edg[j].pre;
q.push(make_pair(-dis[x],x));
}
}
if(!q.empty())
{
while(v[root])
{
root=q.top().second;
q.pop();
}
v[root]=1;
}
}
if(dis[n]<=b)return 1;
else return 0;
}
void add(int x,int y,int z)
{
edg[++cnt].pre=z;
edg[cnt].to=y;
edg[cnt].nex=h[x];
h[x]=cnt;
}
int main()
{
cin>>n>>m>>b;
int maxx=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&f[i]);
maxx=max(maxx,f[i]);
}
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
if(!check(maxx))
{
cout<<"AFK";
return 0;
}
int l,r;
l=1;r=maxx;
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
{
// ans=mid;
r=mid;
}
else l=mid+1;
}
cout<<l;
return 0;
}
/*
4 4 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3
10
*/