#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e4 + 5;
const int maxe = 1e5 + 5;
const int maxt = 1e6 + 5;
bool side[maxt];
int n, e, h[maxe][2], cur[maxn];
vector<int> t[maxn];
bool good() {
  int cnt = 0;
  for (int i = 0; i < e; i++) {
    int u = h[i][0], v = h[i][1];
    if (side[cur[u]] != side[cur[v]]) {
      ++cnt;
    }
  }
  return 2 * cnt >= e;
}
void gen() {
  for (int i = 0; i < n; i++) {
    cur[i] = t[i][rand() % (t[i].size())];
  }
  for (int i = 0; i < maxt; i++) {
    side[i] = rand() % 2;
  }
}
int main() {
  srand(22);
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> e;
  for (int i = 0; i < e; i++) {
    cin >> h[i][0] >> h[i][1];
    --h[i][0];
    --h[i][1];
  }
  int mx = 0;
  for (int i = 0; i < n; i++) {
    int sz;
    cin >> sz;
    for (int j = 0; j < sz; j++) {
      int team;
      cin >> team;
      mx = max(team, mx);
      t[i].push_back(team);
    }
  }
  while (!good()) {
    gen();
  }
  for (int i = 0; i < n; i++) {
    cout << cur[i];
    if (i + 1 < n) {
      cout << ' ';
    }
  }
  cout << '\n';
  for (int i = 1; i <= mx; i++) {
    cout << 1 + side[i];
    if (i + 1 <= mx) {
      cout << ' ';
    }
  }
  cout << '\n';
  return 0;
}
