#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 150'000 + 10;
int n, m, a[MAX_N], b[MAX_N], sz[MAX_N], par[MAX_N], mark[MAX_N], wh[MAX_N];
vector<int> adj[MAX_N], a_t[MAX_N], b_t[MAX_N];
bool can;
void get(int x) {
if (par[x] == x) {
wh[x] = x;
} else {
get(par[x]);
wh[x] = wh[par[x]];
}
}
namespace DC {
vector<int> seg[4 * MAX_N];
bool on[MAX_N];
void add(int u, int id = 1, int l = 1, int r = n + 1) {
if (b[u] <= l && r <= a[u] + 1) {
seg[id].push_back(u);
} else {
int mid = (l + r) >> 1;
if (b[u] < mid) {
add(u, id << 1, l, mid);
}
if (mid <= a[u]) {
add(u, id << 1 | 1, mid, r);
}
}
}
void dfs(int id = 1, int l = 1, int r = n + 1) {
vector<vector<int>> compss;
static int last = 0;
for (int u : seg[id]) {
on[u] = true;
get(u);
compss.push_back({});
++last;
auto& comps = compss.back();
if (mark[wh[u]] != last) {
mark[wh[u]] = last;
comps.push_back(wh[u]);
}
for (int v : adj[u]) {
if (!on[v]) continue;
get(v);
if (mark[wh[v]] != last) {
mark[wh[v]] = last;
comps.push_back(wh[v]);
}
}
if (comps.size() > 1) {
for (int i = 1; i < comps.size(); ++i) {
if (sz[comps[i]] > sz[comps[0]]) {
swap(comps[i], comps[0]);
}
}
for (int i = 1; i < comps.size(); ++i) {
par[comps[i]] = comps[0];
sz[comps[0]] += sz[comps[i]];
}
}
}
if (r - l == 1) {
++last;
for (int u : a_t[l]) {
get(u);
mark[wh[u]] = last;
}
for (int u : b_t[l]) {
get(u);
can &= mark[wh[u]] == last;
}
} else {
int mid = (l + r) >> 1;
dfs(id << 1, l, mid);
dfs(id << 1 | 1, mid, r);
}
for (int u : seg[id]) {
on[u] = false;
}
for (auto& comps : compss) {
if (comps.size() > 1) {
for (int i = 1; i < comps.size(); ++i) {
par[comps[i]] = comps[i];
sz[comps[0]] -= sz[comps[i]];
}
}
}
}
void reset(int id = 1, int l = 1, int r = n + 1) {
seg[id].clear();
if (r - l > 1) {
int mid = (l + r) >> 1;
reset(id << 1, l, mid);
reset(id << 1 | 1, mid, r);
}
}
}
void solve() {
cin >> n >> m;
for (int u = 1; u <= n; ++u) {
cin >> a[u];
a_t[a[u]].push_back(u);
}
for (int u = 1; u <= n; ++u) {
cin >> b[u];
b_t[b[u]].push_back(u);
}
for (int e = 1; e <= m; ++e) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for (int u = 1; u <= n; ++u) {
if (b[u] > a[u]) {
cout << "0\n";
return;
}
sz[u] = 1;
par[u] = u;
DC::add(u);
}
can = true;
DC::dfs();
if (can) {
cout << "1\n";
} else {
cout << "0\n";
}
}
void clear_data() {
DC::reset();
for (int i = 1; i <= n; ++i) {
a[i] = b[i] = sz[i] = par[i] = wh[i] = 0;
adj[i].clear();
a_t[i].clear();
b_t[i].clear();
}
n = m = 0;
can = false;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
while (T--) {
solve();
clear_data();
}
}