#include [[nodiscard]] static inline constexpr std::vector prepare(const uint_fast32_t N, [[maybe_unused]] const uint_fast32_t M, const std::vector>& edges) noexcept { std::vector connect_mask(N, 0); for (const auto& [u, v] : edges) connect_mask[u - 1] |= UINT32_C(1) << (v - 1), connect_mask[v - 1] |= UINT32_C(1) << (u - 1); return connect_mask; } [[nodiscard]] static inline constexpr uint_fast32_t solve(const uint_fast32_t N, const std::vector& A, const std::vector& connect_mask) noexcept { for (uint_fast32_t i = 0; i != (UINT32_C(1) << N); ++i) { uint_fast32_t j = 0; for (j = 0; j != N; ++j) if (std::popcount(connect_mask[j] & i) != A[j]) break; if (j == N) return i; } return UINT_FAST32_MAX; } static inline void output(const uint_fast32_t N, const uint_fast32_t ans) noexcept { if (ans >= (UINT32_C(1) << N)) std::cout << "No\n"; else { std::cout << "Yes\n" << (ans & 1); for (uint_fast32_t i = 1; i != N; ++i) std::cout << ' ' << ((ans >> i) & 1); std::cout << '\n'; } } int main() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); uint_fast32_t N, M; std::cin >> N >> M; std::vector A(N); std::vector> edges(M); for (auto& a : A) std::cin >> a; for (auto& [u, v] : edges) std::cin >> u >> v; output(N, solve(N, A, prepare(N, M, edges))); return 0; }