#include <bits/stdc++.h>   using namespace std;   int gcd(int a, int b) {     if (b == 0)       return a;     else       return gcd(b, a % b);   }   long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }   int main() {     ios_base::sync_with_stdio(false);     int n, m;     cin >> n >> m;     vector<vector<int> > edges(n + 10, vector<int>());     for (int i = 0; i < m; i++) {       int x, y;       cin >> x >> y;       edges[x].push_back(y);       edges[y].push_back(x);     }     map<int, int> not_first;     map<int, int> not_second;     map<int, int> not_third;     set<int> first;     set<int> second;     set<int> third;     for (int i = 1; i < n + 1; i++) {       if (not_first.find(i) == not_first.end()) {         first.insert(i);         for (int j = 0; j < edges[i].size(); j++) {           not_first[edges[i][j]]++;         }       } else if (not_second.find(i) == not_second.end()) {         second.insert(i);         for (int j = 0; j < edges[i].size(); j++) {           not_second[edges[i][j]]++;         }       } else if (not_third.find(i) == not_third.end()) {         third.insert(i);         for (int j = 0; j < edges[i].size(); j++) {           not_third[edges[i][j]]++;         }       } else {         cout << -1;         return 0;       }     }     if (second.size() == 0 or third.size() == 0) {       cout << -1;     } else {       for (auto i = not_first.begin(); i != not_first.end(); i++) {         if (i->second != first.size()) {           cout << -1;           return 0;         }       }       for (auto i = not_second.begin(); i != not_second.end(); i++) {         if (i->second != second.size()) {           cout << -1;           return 0;         }       }       for (auto i = not_third.begin(); i != not_third.end(); i++) {         if (i->second != third.size()) {           cout << -1;           return 0;         }       }       vector<int> cols(n + 1, 0);       for (auto i = first.begin(); i != first.end(); i++) {         cols[*i] = 1;       }       for (auto i = second.begin(); i != second.end(); i++) {         cols[*i] = 2;       }       for (auto i = third.begin(); i != third.end(); i++) {         cols[*i] = 3;       }       for (int i = 1; i < n + 1; i++) {         cout << cols[i] <<    ;       }     }     return 0;   }   