# include<iostream>
# include<queue>
# include<cstring>
# include<stack>
# define inf 0x3f3f3f3f
using namespace std;
const int maxn=50;
typedef struct node{
int adj; //顶点之间的权重
}node;
typedef struct graph{
int vertex[maxn];
node vertexs[maxn][maxn];//邻接矩阵
int vertexnum;
int edgenum;
}graph;
int indegree[maxn];
queue<int> q;
stack<int> ss;
int ve[maxn];//事件最早发生时间
int vl[maxn];//事件最迟发生事件
int e[maxn];//活动最早开始时间
int l[maxn];//活动最迟开始时间
int find(graph g,int i) //寻找对应顶点的索引
{
for(int j=0;j<g.vertexnum;j++)
if(g.vertex[j]==i)
return j;
return -1;
}
void init(graph &g) //初始化图
{
cin>>g.vertexnum>>g.edgenum;
for(int i=0;i<g.vertexnum;i++)
cin>>g.vertex[i];
for(int i=0;i<g.vertexnum;i++)
for(int j=0;j<g.vertexnum;j++)
g.vertexs[i][j].adj=inf;
for(int i=0;i<g.edgenum;i++)
{
int u,v,w;
cin>>u>>v>>w;
int index_u=find(g,u);
int index_v=find(g,v);
g.vertexs[index_u][index_v].adj=w;
}
}
void findindegree(graph g,int indegree[])
{
for(int i=0;i<g.vertexnum;i++)
{
for(int j=0;j<g.vertexnum;j++)
{
if(i!=j&&g.vertexs[j][i].adj!=inf) //有j到i的边 ,就让i的入度加1;
indegree[i]++;
}
}
}
bool topulogicalsort(graph g)
{
int cnt=0;
for(int i=0;i<g.vertexnum;i++) //入度为0的顶点进队列
{
if(!indegree[i])
q.push(i);
ve[i]=0;
}
while(!q.empty())
{
int k=q.front();
q.pop();
ss.push(k);
cnt++;
for(int i=0;i<g.vertexnum;i++)
{
int w=g.vertexs[k][i].adj;
if(w!=inf) //表示相邻
{
indegree[i]--;
if(!indegree[i])
q.push(i);
if(ve[k]+w>ve[i])
ve[i]=ve[k]+w;
}
}
}
if(cnt<g.vertexnum) return false;
return true;
}
void criticalpath(graph g)
{
if(!topulogicalsort(g))
{
cout<<"存在回路"<<endl;
return ;
}
for(int i=0;i<g.vertexnum;i++) //初始化事件最迟开始时间
vl[i]=ve[g.vertexnum-1];
while(!ss.empty())
{
int k=ss.top();
ss.pop();
for(int i=0;i<g.vertexnum;i++)
{
int w=g.vertexs[k][i].adj;
if(w!=inf)
{
if(vl[k]>vl[i]-w)
vl[k]=vl[i]-w;
}
}
}
for(int i=0;i<g.vertexnum;i++)
{
for(int j=0;j<g.vertexnum;j++)
{
int w=g.vertexs[i][j].adj;
if(w!=inf)
{
int ee=ve[i];
int el=vl[j]-w;
if(ee==el)
{
cout<<"V"<<g.vertex[i]<<"->"<<"V"<<g.vertex[j]<<" dis"<<w<<endl;
}
}
}
}
}
int main()
{
graph g;
init(g);
memset(indegree,0,sizeof(indegree));
findindegree(g,indegree);
criticalpath(g);
return 0;
}