#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
inline long long max3(long long a, long long b, long long c) {
  return (a) > (b) ? ((a) > (c) ? (a) : (c)) : ((b) > (c) ? (b) : (c));
}
inline long long min3(long long a, long long b, long long c) {
  return (a) < (b) ? ((a) < (c) ? (a) : (c)) : ((b) < (c) ? (b) : (c));
}
const long long int N = 1e5 + 5;
vector<vector<int>> adj(N);
vector<long long int> vis(N), h(N), p(N);
vector<long long int> level_sum(N);
long long int n;
vector<long long int> sub_tree_popn(N);
vector<pair<long long int, long long int>> checker(N);
int flag = 1;
int bfs() {
  int v = 1;
  pair<long long int, long long int> pr;
  queue<pair<long long int, long long int>> q;
  q.push({v, 0});
  vis[v] = 1;
  int prev_i = 0, prev;
  int cur_i = 0, cur;
  while (!q.empty()) {
    pr = q.front();
    v = pr.first;
    q.pop();
    level_sum[pr.second] += h[v];
    for (auto e : adj[v]) {
      if (!vis[e]) q.push({e, pr.second + 1});
    }
  }
  for (long long int(i) = 0; (i) < (n - 1); (i)++) {
    if (level_sum[i] < level_sum[i + 1]) return 0;
  }
  return 1;
}
int calc_sub_popn(int v, int pr) {
  if (sub_tree_popn[v] != -1) return sub_tree_popn[v];
  int z = 0;
  for (auto e : adj[v]) {
    if (e == pr) continue;
    z += calc_sub_popn(e, v);
  }
  sub_tree_popn[v] = z + p[v];
  return sub_tree_popn[v];
}
void checkers(int p, int v) {
  int x = 0, y = 0, X = checker[v].first, Y = checker[v].second;
  for (auto e : adj[v]) {
    if (e == p) continue;
    x += checker[e].first;
    y += checker[e].second;
    if (adj[e].size() != 1) checkers(v, e);
  }
  if (x > X) {
    flag = 0;
  }
}
void solve() {
  long long int m, t = 0, k = 0, x = 0, y = 0, z = 0, a1, a2, a3, a4, a5,
                   var = 1, f = 9223372036854775807;
  flag = 1;
  cin >> n >> m;
  for (long long int(i) = 0; (i) < (n); (i)++) {
    checker[i + 1] = {0, 0};
    sub_tree_popn[i + 1] = -1;
    level_sum[i] = 0;
    cin >> p[i + 1];
    adj[i + 1].clear();
    vis[i + 1] = 0;
  }
  level_sum[n] = 0;
  for (long long int(i) = 0; (i) < (n); (i)++) cin >> h[i + 1];
  for (long long int(i) = 0; (i) < (n - 1); (i)++) {
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  for (long long int(i) = (2); (i) < (n + 1); (i)++) {
    if (adj[i].size() == 1) {
      sub_tree_popn[i] = p[i];
    }
  }
  calc_sub_popn(1, 0);
  assert(sub_tree_popn[1] == m);
  if (flag && (m + h[1]) % 2 == 0 && m + h[1] >= 0) {
    x = (m + h[1]) / 2;
    y = m - x;
    checker[1] = {x, y};
    if (x < 0 || y < 0 || x > m) {
      cout << "NO\n";
      return;
    }
    for (long long int(i) = (2); (i) < (n + 1); (i)++) {
      if ((sub_tree_popn[i] + h[i]) % 2 != 0 || sub_tree_popn[i] + h[i] < 0) {
        cout << "NO\n";
        return;
      }
      x = (sub_tree_popn[i] + h[i]) / 2;
      y = sub_tree_popn[i] - x;
      if (x < 0 || y < 0 || x > sub_tree_popn[i]) {
        cout << "NO\n";
        return;
      }
      checker[i] = {x, y};
    }
    a1 = 0;
    for (long long int(i) = (2); (i) < (n + 1); (i)++) {
      a1 += checker[i].first;
    }
    checkers(1, 1);
    if (flag)
      cout << "YES\n";
    else
      cout << "NO\n";
  } else
    cout << "NO\n";
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long int T = 1, t = 0;
  cin >> T;
  while (t++ < T) {
    solve();
  }
  cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC
       << "ms\n";
}
