#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for(ll i = 0;i < n;i++)
#define ll long long
#define MOD 1000000007LL
using vi = vector<ll>; // intの1次元の型に vi という別名をつける
using vvi = vector<vi>; // intの2次元の型に vvi という別名をつける
using vvvi = vector<vvi>; // intの2次元の型に vvi という別名をつける
const ll llMAX=9223372036854775807LL; 
const ll llMIN=-9223372036854775808LL;

void myprint1D(vi &data)
{
  REP(i,data.size())
    cout<<data[i]<<" ";
  cout<<endl;
}

//配列を[y][x]で表示
void myprint2D_T(vvi &data)
{
  REP(i,data.size())
    myprint1D(data[i]);
}

//配列を[x][y]で表示
void myprint2D(vvi &data)
{
  ll l1=data.size();
  ll l2=data[0].size();
  REP(j,l2){
    REP(i,l1)
      cout<<data[i][j]<<" ";
    cout<<endl;
  }
}

//print(a,b...)って使い方
void print1(ll a){cout<<a<<endl;}
void print2(ll a,ll b){cout<<a<<" "<<b<<endl;}
void print3(ll a,ll b,ll c){cout<<a<<" "<<b<<" "<<c<<endl;}
void print4(ll a,ll b,ll c,ll d){cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;}
void print5(ll a,ll b,ll c,ll d,ll e){cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<endl;}



//union find
vector<vector<int>> g;
const int N = 200001;
int col[N];


int uf(int pid){
  if (col[pid]==pid){
    return pid;
  }else{
    col[pid]=uf(col[pid]);
    return col[pid];
  }
}




ll n,m,k;
int main() {
  
  ll ans=0;
  cin >> n >> m;

  vi a(n),b(n),va(n);
  REP(i,n) cin>>a[i];
  REP(i,n) cin>>b[i];
  //REP(i,m) cin>>c[i]>>d[i];
  
  for(ll i=0;i<N;i++){
    col[i]=i;
  }

  g.resize(n);
  //g2.resize(n);
  for(int i = 0; i < m; i++) {
    int c, d;
    cin >> c >> d ;
    c--; d--;
    if (c>d){
      int tmp=d;
      d=c;
      c=tmp;
    }
    g[c].emplace_back(d);
    g[d].emplace_back(c);

    if ( uf(c)<uf(d) ){
      col[uf(d)]=uf(c);
    }else{
      col[uf(c)]=uf(d);
    }
  }



  for(ll i=n-1;i>=0;i--){
    if (col[i]!=i){
      col[i]=uf(i);
    }
  }


  for(ll i=0;i<n;i++){
    va[col[i]]+=a[i]-b[i];
  }

  
  int flag=1;
  for(ll i=0;i<n;i++){
    if (va[i]!=0)flag=0;
  }

  if (flag==0){
    cout<<"No"<<endl;
    return 0;
  }else{
    cout<<"Yes"<<endl;
    return 0;
  }


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

#define ll long long
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep2(i, s, n) for (int i = (s); i < (int)(n); i++)
#define all(v) v.begin(), v.end()

struct UnionFind {
    vector<int> par; // par[i]:iの親の番号　(例) par[3] = 2 : 3の親が2

    UnionFind(int N) : par(N) { //最初は全てが根であるとして初期化
        for(int i = 0; i < N; i++) par[i] = i;
    }

    int root(int x) { // データxが属する木の根を再帰で得る：root(x) = {xの木の根}
        if (par[x] == x) return x;
        return par[x] = root(par[x]);
    }

    void unite(int x, int y) { // xとyの木を併合
        int rx = root(x); //xの根をrx
        int ry = root(y); //yの根をry
        if (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのまま
        par[rx] = ry; //xとyの根が同じでない(=同じ木にない)時：xの根rxをyの根ryにつける
    }

    bool same(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返す
        int rx = root(x);
        int ry = root(y);
        return rx == ry;
    }
};
 
int main() {
    int n,m;
    ll suma=0,sumb=0;
    cin >> n >> m;
    vector<int> a(n);
    vector<int> b(n);
    vector<int> diffab(n);
    vector<int> root(n);
    vector<int> c(m);
    vector<int> d(m);
    UnionFind uf(n);
    rep(i,n){
        cin >> a[i];
        suma += a[i];
    }
    rep(i,n){
        cin >> b[i];
        sumb += b[i];
        diffab[i]=b[i]-a[i];
    }
    rep(i,m){
        cin >> c[i] >> d[i];
        int cc=c[i]-1;
        int dd=d[i]-1;
        uf.unite(cc,dd);
    }
    if(suma!=sumb){
        cout << "No" << endl;
        return 0;
    }
    rep(i,n){
        if(diffab[i]!=0){
            root[uf.root(i)]+=diffab[i];
        }
    }
    rep(i,n){
       
        if(root[i]!=0){
           cout << "No" << endl; 
           return 0;
        };
        
    }
    cout << "Yes" << endl; 

    


}