#include <stdio.h>
#include <stdlib.h>
#define Q_MAX 100000
int num[100000];
int map[1000000],next[1000000];
int end;
int head[100000];
int map2[1000000],next2[1000000];
int end2;
int head2[100000];
int min[100000],max[100000];
int used[100000];
int queue[Q_MAX];
int h,r;
void add(int a,int b)
{
map[end] = b;
next[end] = head[a];
head[a] = end++;
}
void add2(int a,int b)
{
map2[end2] = b;
next2[end2] = head2[a];
head2[a] = end2++;
}
void enqueue(int k)
{
if(used[k])
{
return;
}
used[k] = 1;
queue[r] = k;
r = (r + 1) % Q_MAX;
}
int pop(void)
{
int t;
t = queue[h];
used[t] = 0;
h = (h + 1) % Q_MAX;
return t;
}
int main(void)
{
int i,j;
int n,m;
int a,b,c;
int ans;
scanf("%d%d",&n,&m);
for(i = 0;i < n;i++)
{
head[i] = head2[i] = -1;
max[i] = -10000;
min[i] = 0xFFFFFFF;
scanf("%d",&num[i]);
}
for(i = 0;i < m;i++)
{
scanf("%d%d%d",&a,&b,&c);
a--;b--;
if(c == 2)
{
add(a,b);add(b,a);
add2(a,b);add2(b,a);
}
else
{
add(a,b);add2(b,a);
}
}
min[0] = num[0];
enqueue(0);
while(h != r)
{
i = pop();
for(a = head[i];a != -1;a = next[a])
{
j = map[a];
if(min[j] > min[i])
{
min[j] = min[i];
enqueue(j);
}
if(min[j] > num[j])
{
min[j] = num[j];
enqueue(j);
}
}
}
max[n - 1] = num[n - 1];
enqueue(n-1);
while(h != r)
{
i = pop();
for(a = head2[i];a != -1;a = next2[a])
{
j = map2[a];
if(max[j] < max[i])
{
max[j] = max[i];
enqueue(j);
}
if(max[j] < num[j])
{
max[j] = num[j];
enqueue(j);
}
}
}
for(i = ans = 0;i < n;i++)
{
if(ans < max[i] - min[i])
ans = max[i] - min[i];
}
printf("%d\n",ans);
return 0;
}
/**************************************************************
Problem: 2290
User: admin
Language: C
Result: Accepted
Time:305 ms
Memory:19508 kb
****************************************************************/