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

const int N = 2e5 + 7;
vector<int> adj[N];
bool good, vis[N];
long long net;
int a[N], b[N];

void dfs(int i) {
    net += a[i] - b[i];
    vis[i] = true;
    for (int x : adj[i])
        if (!vis[x]) dfs(x);
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) cin >> b[i];
    
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    good = true;

    for (int i = 1; i <= n; i++) {
        if (!vis[i])  net = 0, dfs(i);
        if (net) {
            good = false; break;
        }

    }
    if (good) cout << "Yes" << endl;
    else       cout << "No" << endl;
}
#include <bits/stdc++.h>
using namespace std;

#define ll long long

#define rep(i, n) for (int i = 0; i < (n); i++) 

struct UnionFind {
  // 自分の親の頂点を管理する
  vector<int> par;
  
  UnionFind(int n) : par(n, -1) {} // 初期化
  
  // 頂点xの根の頂点を返す
  int root(int x) {
    // 再帰構造
    // 自分の根は親の根と等しい
    if (par[x] < 0) return x;
    
    else return root(par[x]);
  }
  
  // xとyが同じグループか
  bool issame(int x, int y) {
    return root(x) == root(y);
  }
  
  
  // xとyが辺でつなぐときの処理
  bool unite(int x, int y) {
    
    // x, y を根まで遡る
    x = root(x);
    y = root(y);
    
    // 既に同じグループだったらやることはない
    if (x == y) {
      return false;
    }
    //　異なるグループだったとき
    
    if (par[x] > par[y]) swap(x, y);
    
    par[x] += par[y];
    par[y] = x;
    return true;    
  }
    

    
  int size(int x) {
    return -par[root(x)];
  }
  
};



int main() {
  int N, M;
  cin >> N >> M;
    
  // UnionFind 木の作成
  UnionFind uf(N);
  
  vector<ll> a(N), b(N);
  
  rep(i, N) {
    cin >> a[i];
    a[i]--;
  }
  rep(i, N) {
    cin >> b[i];
    b[i]--;
  }
  
  
  rep(i, M) {
    int c, d;
    cin >> c >> d;
    c--, d--;
    uf.unite(c,d);
  }
  
  
  // 1ならまだ調べていない頂点
  map<ll, ll> ma, mb;
  
  rep(i, N) {
    int r = uf.root(i);
    ma[r] += a[i];
    mb[r] += b[i];
  }
  
  bool cond = true;
  
  rep(i, N) {
    int r = uf.root(i);
    if (ma[r] != mb[r]) {
      cond = false;
      break;
    }
  }
  
  if (cond) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }

  
}