#include <bits/stdc++.h>
using namespace std;
template <typename T>
T Abs(T x) {
  return x > 0 ? x : -x;
}
template <typename T>
T const& Max(T const& a, T const& b) {
  return a > b ? a : b;
}
template <typename T>
T const& Min(T const& a, T const& b) {
  return a < b ? a : b;
}
template <typename T>
inline T gcd(T a, T b) {
  return (b ? gcd(b, a % b) : a);
}
template <typename T>
T sqaa(T a) {
  return a * a;
}
long long int Pow(long long int a, long long int pow) {
  long long int ret = 1;
  for (; pow; pow >>= 1) {
    if (pow & 1) ret = (ret * a);
    a = (a * a);
  }
  return ret;
}
long long int modPow(long long int a, long long int pow, long long int mod) {
  long long int ret = 1;
  for (; pow; pow >>= 1) {
    if (pow & 1) ret = (ret * a) % mod;
    a = (a * a) % mod;
  }
  return ret;
}
long long int modINV(long long int a, long long int M) {
  return modPow(a, M - 2, M);
}
const int MAXN = (1e5) + 10;
int ar[MAXN];
int main() {
  int n, m;
  while (cin >> n >> m) {
    memset(ar, 0, sizeof(ar));
    int k[3];
    set<int> st;
    for (int i = (0); i < (m); i++) {
      st.clear();
      for (int j = (0); j < (3); j++) st.insert(j + 1);
      for (int j = (0); j < (3); j++) cin >> k[j], st.erase(ar[k[j]]);
      for (int j = (0); j < (3); j++) {
        if (!ar[k[j]]) {
          ar[k[j]] = *st.begin();
          st.erase(ar[k[j]]);
        }
      }
    }
    for (int i = (1); i < (n + 1); i++) cout << ar[i] << " ";
    cout << "\n";
  }
  return 0;
}
