#include <bits/stdc++.h>
static const int MAXN = 50004;
static const int MAXE = 100004 * 2;
static const int MAXL = 20;
static const int MAXT = 1000005;
int n, e;
int head[MAXN], dest[MAXE], next[MAXE];
int l[MAXN], t[MAXN][MAXL];
int T = 0;
int p[MAXN];
int conf[MAXN], team[MAXN];
int team_conf[MAXT];
inline void add_edge(int u, int v) {
  static int w = 0;
  dest[w] = v;
  next[w] = head[u];
  head[u] = w++;
}
int main() {
  scanf("%d%d", &n, &e);
  for (int i = 0; i < n; ++i) head[i] = -1;
  int u, v;
  for (int i = 0; i < e; ++i) {
    scanf("%d%d", &u, &v);
    --u, --v;
    add_edge(u, v);
    add_edge(v, u);
  }
  for (int i = 0; i < n; ++i) {
    scanf("%d", &l[i]);
    for (int j = 0; j < l[i]; ++j) {
      scanf("%d", &t[i][j]);
      --t[i][j];
      T = std::max(T, t[i][j]);
    }
  }
  ++T;
  srand(87665544);
  for (int i = 0; i < n; ++i) p[i] = i;
  for (int attempts = 0;; ++attempts) {
    if (attempts % 16 == 0) {
      std::random_shuffle(p, p + n);
      std::fill(conf, conf + n, -1);
      int ct[2];
      for (int i = 0; i < n; ++i) {
        ct[0] = ct[1] = 0;
        for (int w = head[p[i]]; w != -1; w = next[w]) {
          if (conf[dest[w]] != -1) ++ct[conf[dest[w]]];
        }
        conf[p[i]] = (ct[0] > ct[1] ? 1 : 0);
      }
    }
    for (int i = 0; i < T; ++i) team_conf[i] = rand() % 2;
    bool valid = true;
    for (int i = 0; i < n; ++i) {
      team[i] = -1;
      for (int j = 0; j < l[i]; ++j)
        if (conf[i] == team_conf[t[i][j]]) {
          team[i] = t[i][j];
          break;
        }
      if (team[i] == -1) {
        valid = false;
        break;
      }
    }
    if (!valid) continue;
    for (int i = 0; i < n; ++i)
      printf("%d%c", team[i] + 1, i == n - 1 ? '\n' : ' ');
    for (int i = 0; i < T; ++i)
      printf("%d%c", team_conf[i] + 1, i == T - 1 ? '\n' : ' ');
    break;
  }
  return 0;
}
