#include <iostream> #include <vector> #include <cstring> #include <stdio.h> using namespace std; struct Com{ int x,y; Com(int _x,int _y){ x=_x; y=_y; } }; vector <Com> vec[10005]; int value[10005]; int minvalue[10005]; int dfs(int x){ //cout<<"========"<<x<<' '<<minvalue[x]<<endl; if(minvalue[x]!=-1) return minvalue[x]; minvalue[x] = value[x]; for(int i=0 ; i<vec[x].size();i++){ int tmpx,tmpy; if(minvalue[ vec[x][i].x ]!=-1 ) tmpx=minvalue[ vec[x][i].x ]; else minvalue[ vec[x][i].x ] = dfs(vec[x][i].x) , tmpx = minvalue[ vec[x][i].x ]; if(minvalue[ vec[x][i].y ]!=-1 ) tmpy=minvalue[ vec[x][i].y ]; else minvalue[ vec[x][i].y ] = dfs(vec[x][i].y) , tmpy = minvalue[ vec[x][i].y ]; minvalue[x] = min(minvalue[x] , tmpx+tmpy); } //cout<<x<<":"<<minvalue[x]<<endl; return minvalue[x]; } int main() { int m,n; int tmp,x,y; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&value[i]); for(int i=0;i<m;i++){ scanf("%d%d%d",&tmp,&x,&y); vec[tmp].push_back(Com(x,y)); } //cout<<vec[1][0].x<<' '<<vec[1][0].y<<' '<<endl; // cout<<vec[4][0].x<<' '<<vec[4][0].y<<' '<<endl; // cout<<vec[5][0].x<<' '<<vec[5][0].y<<' '<<endl; memset(minvalue,-1,sizeof(minvalue)); printf("%d",dfs(1)); return 0; }