#include <bits/stdc++.h>
using namespace std;

int main() {
  int N, M;
  cin >> N >> M;
  vector<pair<int, int>> P(M);
  for (int i = 0; i < M; i++) cin >> P.at(i).first >> P.at(i).second;
  sort(P.begin(), P.end());
  set<int> S;
  S.insert(N);
  int l = 0;
  while (l < M) {
    vector<int> A, B;
    int r = l;
    while (r < M) {
      if (P.at(r).first == P.at(l).first) r++;
      else break;
    }
    for (int i = l; i < r; i++) {
      int y = P.at(i).second;
      if ((S.count(y - 1) || S.count(y + 1)) && !(S.count(y))) A.push_back(y);
      if ((!S.count(y - 1) && !S.count(y + 1)) && S.count(y)) B.push_back(y);
    }
    for (int i = 0; i < A.size(); i++) S.insert(A.at(i));
    for (int i = 0; i < B.size(); i++) S.erase(B.at(i));
    l = r;
  }
  cout << S.size() << endl;
}
#include <bits/stdc++.h>
using namespace std;

#define REP(i,n) for(long long i=0; i<n; i++)
#define pii pair<long long,long long>
#define vi vector<long long> 
#define vii vector<pii>
#define ll long long

long long par[200001],sizeT[200001],sizeP[200001],sizeX[200001],N,M;

void Initialize(){
	for(long long i=1; i<=N; i++){
		par[i]=i; 
	}
}

long long FindPar(long long x){
	if(par[x]==x){
		return x;
	}else{
		par[x]=FindPar(par[x]);
		return par[x];
	}
}

void Join(long long a, long long b){
	long long RepA=FindPar(a),RepB=FindPar(b);
	if(RepA==RepB)return;
	par[RepA]=RepB; sizeP[RepB] += sizeP[RepA]; sizeP[RepA] = 0;
}

int main(){
	cin>>N>>M;
	for(long long i=1; i<=N; i++){
		cin>>sizeP[i];
	}
	for(long long i=1; i<=N; i++){
		cin>>sizeX[i];
	}
	Initialize();
	for(long long i=1; i<=M; i++){
		long long a,b;
		cin>>a>>b;
		Join(a,b);
	}
	for(long long i=1; i<=N; i++){
		sizeT[FindPar(i)]+=sizeX[i];
	}
	for(long long i=1; i<=N; i++){
		if(sizeT[i]!=sizeP[i]){
			cout<<"No"<<endl; return 0;
		}
	}
	cout<<"Yes"<<endl;
}