#include<stdio.h>
#include<string.h>
char g[1049][1049],inque[1049],inpath[1049];
char inhua[1049];
int st,ed,newbase,ans,ne;
int base[1049],pre[1049],match[1049];
int head,tail,que[1049];
int a[1049],b[1049],d[1049],mp[1049][1049],m,n;
int lca(int u,int v)
{
memset(inpath,0,sizeof(inpath));
while(1)
{
u=base[u];
inpath[u]=1;
if(u==st)
{
break;
}
u=pre[match[u]];
}
while(1)
{
v=base[v];
if(inpath[v])
{
break;
}
v=pre[match[v]];
}
return v;
}
void reset(int u)
{
int v;
while(base[u]!=newbase)
{
v=match[u];
inhua[base[u]]=inhua[base[v]]=1;
u=pre[v];
if(base[u]!=newbase)
{
pre[u]=v;
}
}
}
void contract(int u,int v)
{
newbase=lca(u,v);
memset(inhua,0,sizeof(inhua));
reset(u);
reset(v);
if(base[u]!=newbase)
{
pre[u]=v;
}
if(base[v]!=newbase)
{
pre[v]=u;
}
int i;
for(i=1;i<=ne;i++)
{
if(inhua[base[i]])
{
base[i]=newbase;
if(!inque[i])
{
que[tail]=i;
tail++;
inque[i]=1;
}
}
}
}
void findaug()
{
memset(inque,0,sizeof(inque));
memset(pre,0,sizeof(pre));
int i;
for(i=1;i<=ne;i++)
{
base[i]=i;
}
head=tail=1;
que[tail]=st;
tail++;
inque[st]=1;
ed=0;
while(head<tail)
{
int u=que[head];
head++;
int v;
for(v=1;v<=ne;v++)
{
if(g[u][v]&&(base[u]!=base[v])&&match[u]!=v)
{
if(v==st||(match[v]>0)&&pre[match[v]]>0)
{
contract(u,v);
}
else if(pre[v]==0)
{
pre[v]=u;
if(match[v]>0)
{
que[tail]=match[v];
tail++;
inque[match[v]]=1;
}
else
{
ed=v;
return;
}
}
}
}
}
}
void aug()
{
int u,v,w;
u=ed;
while(u>0)
{
v=pre[u];
w=match[v];
match[v]=u;
match[u]=v;
u=w;
}
}
void edmonds()
{
memset(match,0,sizeof(match));
int u;
for(u=1;u<=ne;u++)
{
if(match[u]==0)
{
st=u;
findaug();
if(ed>0)
{
aug();
}
}
}
}
void create()
{
ne=0;
memset(g,0,sizeof(g));
int i;
for(i=1;i<=n;i++)
{
int j;
for(j=1;j<=d[i];j++)
{
mp[i][j]=++ne;
}
}
for(i=0;i<m;i++)
{
int j;
for(j=1;j<=d[a[i]];j++)
{
g[mp[a[i]][j]][ne+1]=g[ne+1][mp[a[i]][j]]=1;
}
for(j=1;j<=d[b[i]];j++)
{
g[mp[b[i]][j]][ne+2]=g[ne+2][mp[b[i]][j]]=1;
}
g[ne+1][ne+2]=g[ne+2][ne+1]=1;
ne+=2;
}
}
void print()
{
ans=0;
int i;
for(i=1;i<=ne;i++)
{
if(match[i]!=0)
{
ans++;
}
}
if(ans==ne)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&d[i]);
}
for(i=0;i<m;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
create();
edmonds();
print();
}
return 0;
}