有点类似于SPFA,设min[i]是从第一个点到第i个点所购入的最小值,再将所有边反向(这样保证先买后卖),max[i]是从第n个点到第i个点所购入的最大值,最后max[i]-min[i]的最大值即是答案

program trade;
var
  flag:array[1..100000] of boolean;
  a,b:array[1..100000,0..200] of longint;
  v,q,maxv,minv:array[1..100000] of longint;
  n,m:longint;
procedure init;
var
  i,j,x,y,z:longint;
begin
  readln(n,m);
  for i:=1 to n do
  begin
    read(v[i]);
    maxv[i]:=-maxint;
    minv[i]:=maxint;
  end;
  readln;
  for i:=1 to m do
  begin
    readln(x,y,z);
    inc(a[x,0]);
    a[x,a[x,0]]:=y;
    inc(b[y,0]);
    b[y,b[y,0]]:=x;
    if z=2 then
    begin
     inc(a[y,0]);
     a[y,a[y,0]]:=x;
     inc(b[x,0]);
     b[x,b[x,0]]:=y;
    end;
  end;
end;
function max(x,y:longint):longint;
begin
  if x>y then max:=x
    else max:=y;
end;
function min(x,y:longint):longint;
begin
  if x<y then min:=x
    else min:=y;
end;
procedure bfs1;
var
  i,l,r:longint;
begin
  fillchar(q,sizeof(q),0);
  fillchar(flag,sizeof(flag),false);
  minv[1]:=v[1];
  flag[1]:=true;
  l:=0;
  r:=1;
  q[1]:=1;
  while l<>r do
  begin
    flag[q[l]]:=false;
    l:=(l mod n)+1;
    for i:=1 to a[q[l],0] do
      if (minv[q[l]]<minv[a[q[l],i]]) and not flag[a[q[l],i]] then
      begin
        r:=(r mod n)+1;
        q[r]:=a[q[l],i];
        flag[a[q[l],i]]:=true;
        if minv[a[q[l],i]]=maxint then minv[a[q[l],i]]:=min(minv[q[l]],v[a[q[l],i]])
          else minv[a[q[l],i]]:=minv[q[l]];
      end;
  end;
end;
procedure bfs2;
var
  l,r,i:longint;
begin
  fillchar(q,sizeof(q),0);
  fillchar(flag,sizeof(flag),false);
  q[1]:=n;
  flag[n]:=true;
  maxv[n]:=v[n];
  l:=0;
  r:=1;
  while l<>r do
  begin
    flag[q[l]]:=false;
    l:=(l mod n)+1;
    for i:=1 to b[q[l],0] do
      if (maxv[q[l]]>maxv[b[q[l],i]]) and not flag[b[q[l],i]] then
      begin
        r:=(r mod n)+1;
        q[r]:=b[q[l],i];
        flag[q[r]]:=true;
        if maxv[b[q[l],i]]=-maxint then maxv[b[q[l],i]]:=max(maxv[q[l]],v[b[q[l],i]])
          else maxv[b[q[l],i]]:=maxv[q[l]];
      end;
  end;
end;
procedure print;
var
  i,ans:longint;
begin
  ans:=0;
  for i:=1 to n do
    if maxv[i]-minv[i]>ans then ans:=maxv[i]-minv[i];
  writeln(ans);
end;
begin
  assign(input,'trade.in');
  reset(input);
  assign(output,'trade.out');
  rewrite(output);
  init;
  bfs1;
  bfs2;
  print;
  close(input);
  close(output);
end.