#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const int INF = 1000000001;
const long long LINF = 1000000000000000001LL;
void randBitseq(vector<bool> &seq) {
  for (int i = (0); i <= ((int)(seq).size() - 1); ++i) {
    seq[i] = rand() % 2;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  srand(time(0));
  int n, m;
  cin >> n >> m;
  vector<vector<int> > g(n);
  for (int i = (1); i <= (m); ++i) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  int across;
  vector<bool> trainerConf(n);
  do {
    randBitseq(trainerConf);
    across = 0;
    for (int u = (0); u <= (n - 1); ++u)
      for (int v : g[u]) {
        across += (trainerConf[u] != trainerConf[v]);
      }
  } while (across < m);
  vector<vector<int> > teams(n);
  int maxt = 0;
  for (int i = (0); i <= (n - 1); ++i) {
    int l;
    cin >> l;
    while (l--) {
      int team;
      cin >> team;
      team--;
      maxt = max(maxt, team);
      teams[i].push_back(team);
    }
  }
  bool good;
  vector<bool> teamConf(maxt + 1);
  do {
    randBitseq(teamConf);
    good = true;
    for (int u = (0); u <= (n - 1); ++u) {
      bool found = false;
      for (int i : teams[u])
        if (teamConf[i] == trainerConf[u]) {
          found = true;
        }
      good &= found;
    }
  } while (!good);
  for (int u = (0); u <= (n - 1); ++u) {
    for (int i : teams[u])
      if (teamConf[i] == trainerConf[u]) {
        cout << i + 1 << ' ';
        break;
      }
  }
  cout << '\n';
  for (bool b : teamConf) {
    cout << b + 1 << ' ';
  }
  return 0;
}
