#include <iostream>
#include <queue>
#include <vector>
#include <cstring>

using namespace std;

int n, m;
int safe[100005];
int dest[100005];

int main () {
	cin >> n >> m;
	vector<vector<int> > graph(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> safe[i];
		safe[i] = 1 - safe[i]; 
	}
	int v1, v2;
	for (int i = 0; i < m; i++) {
		cin >> v1 >> v2;
		graph[v1].push_back(v2);
		graph[v2].push_back(v1);
	}
	bool ans = false;
	queue<int> q;
	q.push(1);
	dest[1] = 0;
	memset(dest, 0xFF, sizeof(dest));
	while (!ans && !q.empty()) {
		int v = q.front();
		if (v == n) ans = true; 
		q.pop();
		for (vector<int>::iterator it = graph[v].begin(); it != graph[v].end(); it++) {
			if (safe[*it] && dest[*it] < 0) {
				q.push(*it);
				dest[*it] = dest[v] + 1;
			}
		}
	}
	cout << (ans ? "Yes" : "No") << endl; 
}