#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int n,m;
int v[100001];
struct edge{
int from,to,nxt;
}edge1[500001],edgen[500001];
int num_edge1,num_edgen;
int head1[100001],headn[100001];
int minn[100001];
int res=0;
void add(int u,int v)
{
edge1[++num_edge1].from=u;
edge1[num_edge1].to=v;
edge1[num_edge1].nxt=head1[u];
head1[u]=num_edge1;
edgen[++num_edgen].from=v;
edgen[num_edgen].to=u;
edgen[num_edgen].nxt=headn[v];
headn[v]=num_edgen;
}
void bfs1()
{
int top=1;
bool vis[100001]={0};
int q[100001]={0};
memset(minn,0x3f,sizeof(minn));
q[0]=1;
vis[1]=1;
minn[1]=v[1];
for(int i=0;i<top;i++)
{
int u=q[i];
vis[u]=0;
// cout<<"vis " <<u<<" "<<vis[u];
for(int j=head1[u];j;j=edge1[j].nxt)
{
int to=edge1[j].to;
if(minn[to]>min(v[to],minn[u]))
{
minn[to]=min(v[to],minn[u]);
if(!vis[to])
{
vis[to]=1;
q[top++]=to;
}
}
}
}
}
void bfsn()
{
int top=1;
bool vis[100001]={0};
int q[100001]={0};
q[0]=n;
vis[n]=1;
for(int i=0;i<top;i++)
{
// cout<<i;
int u=q[i];
for(int j=headn[u];j;j=edgen[j].nxt)
{
int to=edgen[j].to;
if(!vis[to])
{
vis[to]=1;
res=max(res,v[to]-minn[to]);
q[top++]=to;
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
for(int i=1;i<=m;i++)
{
int u,v,z;
cin>>u>>v>>z;
add(u,v);
if(z==2)
{
add(v,u);
}
}
bfs1();
/* cout<<endl;
for(int i=1;i<=n;i++)
cout<<minn[i]<<' ';
cout<<endl;
*/
bfsn();
cout<<res;
return 0;
}
#include<cmath>
#include<cstring>
using namespace std;
int n,m;
int v[100001];
struct edge{
int from,to,nxt;
}edge1[500001],edgen[500001];
int num_edge1,num_edgen;
int head1[100001],headn[100001];
int minn[100001];
int res=0;
void add(int u,int v)
{
edge1[++num_edge1].from=u;
edge1[num_edge1].to=v;
edge1[num_edge1].nxt=head1[u];
head1[u]=num_edge1;
edgen[++num_edgen].from=v;
edgen[num_edgen].to=u;
edgen[num_edgen].nxt=headn[v];
headn[v]=num_edgen;
}
void bfs1()
{
int top=1;
bool vis[100001]={0};
int q[100001]={0};
memset(minn,0x3f,sizeof(minn));
q[0]=1;
vis[1]=1;
minn[1]=v[1];
for(int i=0;i<top;i++)
{
int u=q[i];
vis[u]=0;
// cout<<"vis " <<u<<" "<<vis[u];
for(int j=head1[u];j;j=edge1[j].nxt)
{
int to=edge1[j].to;
if(minn[to]>min(v[to],minn[u]))
{
minn[to]=min(v[to],minn[u]);
if(!vis[to])
{
vis[to]=1;
q[top++]=to;
}
}
}
}
}
void bfsn()
{
int top=1;
bool vis[100001]={0};
int q[100001]={0};
q[0]=n;
vis[n]=1;
for(int i=0;i<top;i++)
{
// cout<<i;
int u=q[i];
for(int j=headn[u];j;j=edgen[j].nxt)
{
int to=edgen[j].to;
if(!vis[to])
{
vis[to]=1;
res=max(res,v[to]-minn[to]);
q[top++]=to;
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
for(int i=1;i<=m;i++)
{
int u,v,z;
cin>>u>>v>>z;
add(u,v);
if(z==2)
{
add(v,u);
}
}
bfs1();
/* cout<<endl;
for(int i=1;i<=n;i++)
cout<<minn[i]<<' ';
cout<<endl;
*/
bfsn();
cout<<res;
return 0;
}