#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream cin("2sat.in");
ofstream cout("2sat.out");
const int lim=2e5+5;
vector<int> vec[lim];
vector<int> rev[lim];
vector<int> ies[lim];
stack<int> st;
bool ok[lim];
void df(int nod)
{
ok[nod]=true;
for(auto x:vec[nod])
if(!ok[x]) df(x);
st.push(nod);
}
int tip[lim],nrg;
int per[lim];
void grf(int nod)
{
ok[nod]=true;
tip[nod]=nrg;
for(auto x:rev[nod])
if(!ok[x]) grf(x);
}
void cp(int nod)
{
ok[nod]=true;
for(auto x:ies[nod])
if(!ok[x]) cp(x);
st.push(nod);
}
bool val[lim];
int main()
{
int n,m,a,b;
cin>>n>>m;
for(int i=1;i<=m;++i)
{
cin>>a>>b;
vec[n-a].push_back(n+b);
rev[n+b].push_back(n-a);
vec[n-b].push_back(n+a);
rev[n+a].push_back(n-b);
}
for(int i=0;i<=2*n;++i)
if(!ok[i] and i!=n) df(i);
for(int i=0;i<=2*n;++i)
ok[i]=false;
while(!st.empty())
{
int x=st.top();
st.pop();
if(!ok[x])
++nrg,grf(x);
}
ok[0]=false;
for(int i=1;i<=n;++i)
{
if(tip[n+i]==tip[n-i])
{
cout<<-1<<'\n';
return 0;
}
else per[tip[n+i]]=tip[n-i],
per[tip[n-i]]=tip[n+i];
ok[i]=ok[n+i]=false;
}
for(int i=0;i<=2*n;++i)
if(i!=n) for(auto y:vec[i])
ies[tip[i]].push_back(tip[y]);
for(int i=1;i<=nrg;++i)
if(!ok[i]) cp(i);
for(int i=1;i<=nrg;++i)
ok[i]=false;
while(!st.empty())
{
int x=st.top();
st.pop();
if(!ok[x])
{
val[x]=false;
val[per[x]]=true;
ok[x]=ok[per[x]]=true;
}
}
for(int i=n+1;i<=2*n;++i)
cout<<val[tip[i]]<<' ';
return 0;
}