#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef long double ld;
#define rep(i,n) for(ll i=0;i<(n);i++)
#define init(a,i) for(int k=0;k<(i);k++)(a)[k]=0
#define in(a,i) for(int k=0;k<(i);k++)cin>>(a)[k]
#define all(a)  (a).begin(),(a).end()
#define inf 2147483647
#define range(x,a,b) (a)<=x&&x<=(b)
#define mod 323
int top(int *unionfind,int a){
	int c=unionfind[a];
	if(c==a)return a;
	unionfind[a]=top(unionfind,c);
	return unionfind[a];
}

int bind(int *unionfind,int a,int b){
	int c=unionfind[a];
	if(c==a){
		unionfind[a]=b;
		return b;
	}
	unionfind[a]=bind(unionfind,unionfind[a],b);
	return unionfind[a];
}

int add(int *unionfind,int a,int number,ll *num){
	int c=unionfind[a];
	if(c==a){
		num[a]+=number;
		return a;
	}
	unionfind[a]=add(unionfind,unionfind[a],number,num);
	return unionfind[a];
}
	
	
int main(){
	int n,m;
	cin>>n>>m;
	int a[n],b[n];
	in(a,n);in(b,n);
	int ab[n];
	rep(i,n)ab[i]=a[i]-b[i];
	if(m==0){
		int flag=1;
		rep(i,n){
			if(ab[i]!=0)flag=0;
		}
		if(flag==1) cout<<"Yes";
		else cout<<"No";
		return 0;
	}
	int c[m],d[m],tmp;
	rep(i,m){
		cin>>tmp;
		c[i]=tmp-1;
		cin>>tmp;
		d[i]=tmp-1;
	}
	int unionfind[n];
	rep(i,n)unionfind[i]=i;
	rep(i,m) bind(unionfind,c[i],top(unionfind,d[i]));
	ll num[n];
	rep(i,n)num[i]=0;
	rep(i,n){
		add(unionfind,i,ab[i],num);
	}
	int flag=1;
	rep(i,n)if(num[i]!=0)flag=0;
	if(flag==1) cout<<"Yes";
	else cout<<"No";
	return 0;
}
/*  union_find_tree_size.cpp
    素集合系を union-find tree で管理するライブラリ
    併合時の工夫：union by size

    verified: AtCoder ABC157 D - Friend Suggestions
        https://atcoder.jp/contests/abc157/tasks/abc157_d
*/

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

/* UnionFind：素集合系管理の構造体(union by size)
    isSame(x, y): x と y が同じ集合にいるか。 計算量はならし O(α(n))
    unite(x, y): x と y を同じ集合にする。計算量はならし O(α(n))
    treeSize(x): x を含む集合の要素数。
*/
struct UnionFind {
    vector<int> size, parents;
    UnionFind() {}
    UnionFind(int n) {  // make n trees.
        size.resize(n, 0);
        parents.resize(n, 0);
        for (int i = 0; i < n; i++) {
            makeTree(i);
        }
    }
    void makeTree(int x) {
        parents[x] = x;  // the parent of x is x
        size[x] = 1;
    }
    bool isSame(int x, int y) { return findRoot(x) == findRoot(y); }
    bool unite(int x, int y) {
        x = findRoot(x);
        y = findRoot(y);
        if (x == y) return false;
        if (size[x] > size[y]) {
            parents[y] = x;
            size[x] += size[y];
        } else {
            parents[x] = y;
            size[y] += size[x];
        }
        return true;
    }
    int findRoot(int x) {
        if (x != parents[x]) {
            parents[x] = findRoot(parents[x]);
        }
        return parents[x];
    }
    int treeSize(int x) { return size[findRoot(x)]; }
};

int main() {
    int N, M;
    cin >> N >> M;
    UnionFind uf(N);  // Union-Find Tree で考える

    vector<long long> a(N), b(N);
    for (int i = 0; i < N; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < N; i++) {
        cin >> b[i];
    }

    for (int i = 0; i < M; i++) {
        int c, d;
        cin >> c >> d;
        c--, d--;
        uf.unite(c, d);
    }

    map<int, long long> m;
    for (int i = 0; i < N; i++) {
        m[uf.findRoot(i)] += (a[i] - b[i]);
    }

    for (auto p : m) {
        if (p.second != 0) {
            cout << "No" << endl;
            return 0;
        }
    }
    cout << "Yes" << endl;

    return 0;
}
