#include <stdio.h>
#include <queue>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int N = 305;
const int M = 90005;
struct E
{int next,to;}e[M];
int head[N],tot;
void add(int x,int y)
{
e[++tot].to = y;e[tot].next = head[x];head[x]=tot;
e[++tot].to = x;e[tot].next = head[y];head[y]=tot;
}
int nxt[N],pre[N],fa[N],v[N],s[N],n,m;
int getfa(int x)
{
if(fa[x]==x)return fa[x];
else return fa[x]=getfa(fa[x]);
}
queue<int>Q;
int getlca(int x,int y)
{
static int times=0;
++times;
x = getfa(x),y=getfa(y);
for(;;swap(x,y))
if(x)
{
if(v[x]==times)
return x;
v[x] = times;
x = getfa(pre[nxt[x]]);
}
}
void blossom(int x,int y,int lca)
{
while(getfa(x)!=lca)
{
pre[x]=y;
y=nxt[x];
if(s[y]==1)
Q.push(y),s[y]=0;
if(fa[x]==x)
fa[x]=lca;
if(fa[y]==y)
fa[y]=lca;
x=pre[y];
}
}
bool get_partner(int x)
{
for(int i=0;i<=n;i++)
fa[i]=i,s[i]=-1;
while(!Q.empty())
Q.pop();
Q.push(x);
s[x] = 0;
while(!Q.empty())
{
int x= Q.front();
Q.pop();
for(int i = head[x];i;i=e[i].next)
{
if(s[e[i].to]==-1)
{
s[e[i].to]=1;
pre[e[i].to]=x;
if(!nxt[e[i].to])
{
for(int u=e[i].to,v = x,last;v;u=last,v=pre[u])
last = nxt[v],nxt[v]=u,nxt[u]=v;
return true;
}
Q.push(nxt[e[i].to]);
s[nxt[e[i].to]]=0;
}else if(s[e[i].to]==0&&getfa(e[i].to)!=getfa(x))
{
int l = getlca(e[i].to,x);
blossom(x,e[i].to,l);
blossom(e[i].to,x,l);
}
}
}
return false;
}
int d[N];
int x[N],y[N];
int no[N][3];
int main()
{
while (scanf("%d%d",&n,&m)!=EOF) {
for (int i = 1;i<= n;i++)
scanf("%d",&d[i]);
for(int i = 1;i<= m;i++)
scanf("%d%d",&x[i],&y[i]);
int nn = 0;
for (int i = 1;i<= n;i++)
for (int j = 1;j<= d[i];j++)
no[i][j] = ++nn;
for (int i = 1;i<= m;i++)
{
for (int j = 1;j<= d[x[i]];j++)
add(nn+1,no[x[i]][j]);
for (int j = 1;j<= d[y[i]];j++)
add(nn+2,no[y[i]][j]);
add(nn+1,nn+2);
nn+=2;
}
n = nn;
for (int i = 1;i<= n;i++)
nxt[i] = 0;
for(int i = n;i;i--)
if(!nxt[i])
get_partner(i);
int cnt = 0;
for (int i = 1;i<= n;i++)
if (nxt[i])
cnt++;
/*printf("%d\n",ans);
for(int i = 1;i<= n;i++)
printf("%d ",next[i]);
printf("\n");*/
if (cnt == n)
printf("Yes\n");
else printf("No\n");
for (int i = 0;i< N;i++)
{
pre[i] = fa[i] = nxt[i] = head[i] = v[i] = s[i] = 0;
d[i] = x[i] = y[i] = no[i][1] = no[i][2] = 0;
}
tot = 0;
}
return 0;
}