int n, m; int c[kMaxN], s[kMaxN], f[kMaxN]; bool have[kMaxN], vis[kMaxN], v1[kMaxN]; std::vector<int> G[kMaxN], st[kMaxN];
boolbfs1(){ std::queue<int> q; for (int i = 1; i <= n; ++i) { st[i].clear(); have[i] = vis[i] = v1[i] = 0; } q.emplace(1), vis[1] = have[s[1]] = 1; while (!q.empty()) { int u = q.front(); q.pop(); for (auto v : st[s[u]]) if (!vis[v]) q.emplace(v), vis[v] = have[s[v]] = 1; st[s[u]].clear(); for (auto v : G[u]) { if (vis[v]) continue; if (have[c[v]]) q.emplace(v), vis[v] = have[s[v]] = 1; else st[c[v]].emplace_back(v); } } for (int i = 1; i <= n; ++i) if (!vis[i]) v1[i] = 1; for (int i = 1; i <= n; ++i) if (!vis[i] && s[i] != f[i]) return0; return1; }
boolbfs2(){ std::queue<int> q; for (int i = 1; i <= n; ++i) { st[i].clear(); have[i] = vis[i] = 0; } q.emplace(1), vis[1] = have[f[1]] = 1; while (!q.empty()) { int u = q.front(); q.pop(); for (auto v : st[f[u]]) if (!vis[v]) q.emplace(v), vis[v] = have[f[v]] = 1; st[f[u]].clear(); for (auto v : G[u]) { if (vis[v] || v1[v]) continue; if (have[c[v]] || c[v] == f[v]) q.emplace(v), vis[v] = have[f[v]] = 1; else st[c[v]].emplace_back(v); } } for (int i = 1; i <= n; ++i) if (!vis[i] && s[i] != f[i]) return0; return1; }
voiddickdreamer(){ std::cin >> n >> m; for (int i = 1; i <= n; ++i) G[i].clear(); for (int i = 1; i <= n; ++i) std::cin >> c[i]; for (int i = 1; i <= n; ++i) std::cin >> s[i]; for (int i = 1; i <= n; ++i) std::cin >> f[i]; for (int i = 1; i <= m; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v), G[v].emplace_back(u); } std::cout << ((bfs1() && bfs2()) ? "YES\n" : "NO\n"); }