#include <bits/stdc++.h>
using namespace std;
struct sans {
  long long int t1;
  long long int t2;
};
bool func(vector<long long int> s1, vector<long long int> s2) {
  return s1[1] < s2[1];
}
string sub(string s1, long long int i, long long int l) {
  string s2 = "";
  for (long long int j = i; j <= l; j++) {
    s2 = s2 + s1[j];
  }
  return s2;
}
long long int power(long long int x, long long int y, long long int p) {
  long long int res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
long long int max3(long long int a, long long int b, long long int c) {
  return max(max(a, b), c);
}
long long int mod;
long long int N;
long long int modular_exp(long long int base, long long int exp,
                          long long int mod) {
  long long int ans = 1;
  while (exp) {
    if (exp % 2) ans = ans % mod * base % mod;
    base = (base % mod * base % mod) % mod;
    exp /= 2;
    ans %= mod;
  }
  return ans;
}
long long int inverse_modulo(long long int base, long long int mod) {
  return modular_exp(base, mod - 2, mod);
}
long long int fact[5 * 100000 + 5];
void pre_compute() {
  fact[0] = 1;
  for (long long int i = 1; i < N; i++) {
    fact[i] = i * fact[i - 1];
    fact[i] %= mod;
  }
}
long long int nCr(long long int n, long long int r) {
  if (r >= n or r == 0) return 1;
  return ((fact[n] % mod * inverse_modulo(fact[r], mod) % mod) *
          inverse_modulo(fact[n - r], mod)) %
         mod;
}
map<long long int, vector<long long int> > v1;
long long int stat[100000 + 1], th[100000 + 1], ts[100000 + 1], to[100000 + 1],
    father[100000 + 1], h[100000 + 1], tn[100000 + 1];
void dfs(long long int start) {
  stack<int> s1;
  s1.push(start);
  long long int ans = 0;
  while (!s1.empty()) {
    long long int qw = s1.top();
    if (v1[qw].size() == 1 && qw != start) {
      if (max(h[qw], -h[qw]) > to[qw] || ((to[qw] + h[qw]) % 2) != 0) {
        cout << "NO" << endl;
        return;
      }
      to[father[qw]] += to[qw];
      th[father[qw]] += (h[qw] + to[qw]) / 2;
      ts[father[qw]] += (to[qw] - h[qw]) / 2;
      s1.pop();
    }
    if (stat[qw] == 1) {
      if (max(h[qw], -h[qw]) > to[qw] || ((to[qw] + h[qw]) % 2) != 0) {
        cout << "NO" << endl;
        return;
      }
      if (h[qw] - th[qw] + ts[qw] + tn[qw] < 0 ||
          (h[qw] - th[qw] + ts[qw] + tn[qw]) % 2 != 0) {
        cout << "NO" << endl;
        return;
      }
      to[father[qw]] += to[qw];
      th[father[qw]] += (h[qw] + to[qw]) / 2;
      ts[father[qw]] += (to[qw] - h[qw]) / 2;
      s1.pop();
    } else {
      for (long long int i = 0; i < v1[qw].size(); i++) {
        if (stat[v1[qw][i]] == 0) {
          s1.push(v1[qw][i]);
          father[v1[qw][i]] = qw;
        }
      }
      stat[qw] = 1;
    }
  }
  cout << "YES" << endl;
}
void solve(long long int index) {
  v1.clear();
  long long int n, m;
  cin >> n >> m;
  for (long long int i = 1; i <= n; i++) {
    stat[i] = 0;
    th[i] = 0;
    ts[i] = 0, to[i] = 0;
    father[i] = 0;
    h[i] = 0;
    tn[i] = 0;
  }
  for (long long int i = 1; i <= n; i++) {
    cin >> to[i];
    tn[i] = to[i];
  }
  for (long long int i = 1; i <= n; i++) {
    cin >> h[i];
  }
  for (long long int i = 1; i <= n - 1; i++) {
    long long int x1, x2;
    cin >> x1 >> x2;
    v1[x1].push_back(x2);
    v1[x2].push_back(x1);
  }
  dfs(1);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long int t;
  cin >> t;
  long long int n = t;
  long long int i = 0;
  while (t--) {
    i++;
    solve(i);
  }
}
