#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define all(a) a.begin(),a.end()
using namespace std;
mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l,int r)
{
uniform_int_distribution<int> uid(l,r);
return uid(mt);
}
typedef pair<int, int> ii;
const int N = 1e6+5;
int n,m;
int l[N], conference[N], team[N];
vector<vector<int>> a;
ii p[N];
void solve()
{
// Ghi lại thời điểm bắt đầu chương trình
auto start = clock();
// Input
cin>>n>>m;
a.resize(n+1);
for (int i = 1; i <= m; i++) cin>>p[i].fi>>p[i].se;
int mx = 0; // Lưu nhóm có index lớp nhất
for (int i = 1; i <= n; i++)
{
cin>>l[i];
a[i].resize(l[i]);
for (int j = 0; j < l[i]; j++) cin>>a[i][j], mx = max(mx, a[i][j]);
}
while (true)
{
if (clock() - start > 4950) break; // Kiểm tra xem đến lần duyệt này đã vượt quá thời gian cho phép hay chưa
// Gán mỗi người 1 nhóm bất kì trong wishlist của người đó
for (int i = 1; i <= n; i++) team[i] = a[i][rnd(0, l[i]-1)];
// Phân chia các nhóm vào các bảng đấu một cách random
for (int i = 1; i <= mx; i++) conference[i] = rnd(1,2);
// Đếm số lượng cặp ghét nhau
int cnt = 0;
for (int i = 0; i < m; i++)
{
int x = p[i].fi, y = p[i].se;
if (conference[team[x]] != conference[team[y]]) cnt++;
}
// Nếu cách xếp này thỏa mãn thì in ra
if (cnt * 2 >= m)
{
for (int i = 1; i <= n; i++) cout<<team[i]<<" ";
cout<<"\n";
for (int i = 1; i <= mx; i++) cout<<conference[i]<<" ";
return;
}
}
}
int main()
{
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBhbGwoYSkgYS5iZWdpbigpLGEuZW5kKCkKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgptdDE5OTM3IG10KGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7CgppbnQgcm5kKGludCBsLGludCByKSAKewogICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gdWlkKGwscik7CiAgICByZXR1cm4gdWlkKG10KTsKfQoKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsKY29uc3QgaW50IE4gPSAxZTYrNTsKCmludCBuLG07CmludCBsW05dLCBjb25mZXJlbmNlW05dLCB0ZWFtW05dOwp2ZWN0b3I8dmVjdG9yPGludD4+IGE7CmlpIHBbTl07Cgp2b2lkIHNvbHZlKCkKewoJLy8gR2hpIGzhuqFpIHRo4budaSDEkWnhu4NtIGLhuq90IMSR4bqndSBjaMawxqFuZyB0csOsbmgKCWF1dG8gc3RhcnQgPSBjbG9jaygpOwoJLy8gSW5wdXQKCWNpbj4+bj4+bTsKCWEucmVzaXplKG4rMSk7Cglmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspIGNpbj4+cFtpXS5maT4+cFtpXS5zZTsKCWludCBteCA9IDA7IC8vIEzGsHUgbmjDs20gY8OzIGluZGV4IGzhu5twIG5o4bqldAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSAKCXsKCQljaW4+PmxbaV07CgkJYVtpXS5yZXNpemUobFtpXSk7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBsW2ldOyBqKyspIGNpbj4+YVtpXVtqXSwgbXggPSBtYXgobXgsIGFbaV1bal0pOwoJfQoJd2hpbGUgKHRydWUpIAoJewoJCWlmIChjbG9jaygpIC0gc3RhcnQgPiA0OTUwKSBicmVhazsgLy8gS2nhu4NtIHRyYSB4ZW0gxJHhur9uIGzhuqduIGR1eeG7h3QgbsOgeSDEkcOjIHbGsOG7o3QgcXXDoSB0aOG7nWkgZ2lhbiBjaG8gcGjDqXAgaGF5IGNoxrBhCgkJLy8gR8OhbiBt4buXaSBuZ8aw4budaSAxIG5ow7NtIGLhuqV0IGvDrCB0cm9uZyB3aXNobGlzdCBj4bunYSBuZ8aw4budaSDEkcOzCgkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB0ZWFtW2ldID0gYVtpXVtybmQoMCwgbFtpXS0xKV07IAoJCS8vIFBow6JuIGNoaWEgY8OhYyBuaMOzbSB2w6BvIGPDoWMgYuG6o25nIMSR4bqldSBt4buZdCBjw6FjaCByYW5kb20KCQlmb3IgKGludCBpID0gMTsgaSA8PSBteDsgaSsrKSBjb25mZXJlbmNlW2ldID0gcm5kKDEsMik7CgkJLy8gxJDhur9tIHPhu5EgbMaw4bujbmcgY+G6t3AgZ2jDqXQgbmhhdQoJCWludCBjbnQgPSAwOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSAKCQl7CgkJCWludCB4ID0gcFtpXS5maSwgeSA9IHBbaV0uc2U7CgkJCWlmIChjb25mZXJlbmNlW3RlYW1beF1dICE9IGNvbmZlcmVuY2VbdGVhbVt5XV0pIGNudCsrOwoJCX0KCQkvLyBO4bq/dSBjw6FjaCB44bq/cCBuw6B5IHRo4buPYSBtw6NuIHRow6wgaW4gcmEKCQlpZiAoY250ICogMiA+PSBtKSAKCQl7CgkJCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY291dDw8dGVhbVtpXTw8IiAiOwoJCQljb3V0PDwiXG4iOwoJCQlmb3IgKGludCBpID0gMTsgaSA8PSBteDsgaSsrKSBjb3V0PDxjb25mZXJlbmNlW2ldPDwiICI7CgkJCXJldHVybjsKCQl9Cgl9Cn0KCmludCBtYWluKCkKewoJc29sdmUoKTsKfQ==