#include<stdio.h>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
FILE*f=fopen("casute.in","r");
FILE*g=fopen("casute.out","w");
int ok,nr,j,i,n,m,x,y,w[3002];
short int sol[4500000];
char viz[3002],b[3002][6002];
vector <int> v[3002];
vector <short int> a[3002];
void dfs(int nod)
{
if(!viz[nod])
{
a[i].push_back (nod);
viz[nod]=1;
}
for(int j=0;j<v[nod].size();++j)
dfs(v[nod][j]);
}
void Dfs(int nod,int st,int dr,int A,int B)
{
b[i][nod]=1;
if(st==dr)
return ;
int x=(st+dr)/2;
int p=A;
int u=B;
int m;
while(p<=u)
{
m=(p+u)/2;
if(a[i][m]<=x)
p=m+1;
else
u=m-1;
}
int nodst=nod<<1;
int noddr=nodst+1;
if(p>A)
Dfs(nodst,st,x,A,p-1);
if(p<=B)
Dfs(noddr,x+1,dr,p,B);
}
void cauta(int nod,int st,int dr)
{
if(!ok)
return ;
if(st==dr)
{
sol[nr]=st;
ok=0;
}
int x=(st+dr)/2;
int nodst=nod<<1;
int noddr=nodst+1;
if(b[i][nodst]&&b[j][nodst])
cauta(nodst,st,x);
if(b[i][noddr]&&b[j][noddr])
cauta(noddr,x+1,dr);
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;++i)
fscanf(f,"%d",&w[i]);
for(i=1;i<=m;++i)
{
fscanf(f,"%d%d",&x,&y);
if(w[x]<w[y])
v[x].push_back (y);
else
v[y].push_back (x);
}
for(i=1;i<=n;++i)
{
dfs(i);
sort(a[i].begin(),a[i].end());
memset(viz,0,sizeof(viz));
Dfs(1,1,n,0,a[i].size()-1);
}
for(i=1;i<n;++i)
for(j=i+1;j<=n;++j)
{
ok=1;
++nr;
cauta(1,1,n);
}
fclose(f);
fclose(g);
return 0;
}