过得了样例。 data:
#include<bits/stdc++.h>
#define N 2000010
using namespace std;
int n, m, u, v, tot, dcccnt, cnt, top;
int h[N], dfn[N], low[N], col[N], st[N];
bool a, b;
bool vis[N];
struct node{
int ne, to;
}G[N];
void add(int u, int v){
G[++tot] = {h[u], v};
h[u] = tot;
}
void tarjan(int u){
dfn[u] = low[u] = ++dcccnt;
st[++top] = u;
vis[u] = true;
for(int i = h[u]; i; i = G[i].ne){
int v = G[i].to;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(vis[v]) low[u] = min(low[u], dfn[v]);
}
if(dfn[u] == low[u]){
cnt++;
while(true){
int t = st[top--];
col[t] = cnt;
vis[t] = false;
if(t == u) break;
}
}
}
int main(){
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d %d %d %d", &u, &a, &v, &b);
if(a && b){
add(u, v + n);
add(v, u + n);
}
else if(a && !b){
add(u, v);
add(v + n, u + n);
}
else if(!a && b){
add(u + n, v + n);
add(v, u);
}
else{
add(u + n, v);
add(v + n, u);
}
}
for(int i = 1; i <= n << 1; i++){
if(!dfn[i]) tarjan(i);
}
for(int i = 1; i <= n; i++){
if(col[i] == col[i + n]){
printf("IMPOSSIBLE");
return 0;
}
}
puts("POSSIBLE");
for(int i = 1; i <= n; i++){
if(col[i] < col[i + n]) printf("1 ");
else printf("0 ");
}
return 0;
}