Problem: Welcome to the world of Pokermon, yellow little mouse-like creatures, who absolutely love playing poker! 

Yeah, right… 

In the ensuing Pokermon League, there are n registered Pokermon trainers, and t existing trainer teams each of which belongs to one of two conferences. Since there is a lot of jealousy between trainers, there are e pairs of trainers who hate each other. Their hate is mutual, there are no identical pairs among these, and no trainer hates himself (the world of Pokermon is a joyful place!). Each trainer has a wish-list of length li of teams he’d like to join.

Your task is to divide players into teams and the teams into two conferences, so that: 

  * each trainer belongs to exactly one team; 
  * no team is in both conferences; 
  * total hate between conferences is at least e / 2; 
  * every trainer is in a team from his wish-list. 



Total hate between conferences is calculated as the number of pairs of trainers from teams from different conferences who hate each other. 

Input

The first line of the input contains two integer n (4 ≤ n ≤ 50 000) and e (2 ≤ e ≤ 100 000) — the total number of Pokermon trainers and the number of pairs of trainers who hate each other.

Pokermon trainers are numbered from 1 to n. Next e lines contain two integers a and b (1 ≤ a, b ≤ n) indicating that Pokermon trainers a and b hate each other. Next 2n lines are in a following format. Starting with Pokermon trainer 1, for each trainer in consecutive order: first number li (16 ≤ li ≤ 20) — a size of Pokermon trainers wish list, then li positive integers ti, j (1 ≤ ti, j ≤ T), providing the teams the i-th trainer would like to be on.

Each trainers wish list will contain each team no more than once. Teams on the wish lists are numbered in such a way that the set of all teams that appear on at least 1 wish list is set of consecutive positive integers {1, 2, 3, …, T}. Here T might be up to 1 000 000.

Output

Print two lines. The first line should contain n numbers, specifying for each trainer the team he is in.

The second line should contain T numbers, specifying the conference for each team (1 or 2).

Example

Input

4 3
1 2
2 3
4 1
16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 15
16
2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18
16
2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 19
16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 19


Output

16 15 19 14 
2 2 2 1 1 1 2 1 1 2 1 1 1 2 2 1 1 1 1 

Note

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.security.AllPermission;
import java.util.ArrayList;
import java.util.Random;
import java.util.StringTokenizer;


public class H {

	static StringTokenizer st;
	static BufferedReader br;
	static PrintWriter pw;
	static ArrayList<Integer>[]ages;
	public static void main(String[] args) throws IOException {
		br = new BufferedReader(new InputStreamReader(System.in));
		pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
		int n = nextInt();
		int e = nextInt();
		ages = new ArrayList[n+1];
		for (int i = 1; i <= n; i++) {
			ages[i] = new ArrayList<>();
		}
		int[]a = new int[e], b = new int[e];
		for (int i = 0; i < e; i++) {
			a[i] = nextInt();
			b[i] = nextInt();
			ages[a[i]].add(b[i]);
			ages[b[i]].add(a[i]);
		}
		int[]conferences = new int[n+1];
		for (int i = 1; i <= n; i++) {
			int hates1 = 0, hates2 = 0;
			for (int j : ages[i]) {
				if (conferences[j]==2)
					hates1++;
				else if (conferences[j]==1)
					hates2++;
			}
			if (hates1 >= hates2)
				conferences[i] = 1;
			else
				conferences[i] = 2;
		}
		int s = 0;
		for (int i = 0; i < e; i++) {
			if (conferences[a[i]] != conferences[b[i]])
				s++;
		}
		if (s*2 < e) {
			while (true) {
				s++;
			}
		}
		int[]cnf_team = new int[1000001];
		int[]team = new int[n+1];
		int cnt_team = 0;
		Random rm = new Random();
		for (int i = 1; i <= n; i++) {
			int L = nextInt();
			int[]t = new int[L];
			for (int j = 0; j < L; j++) {
				t[j] = nextInt();
				if (t[j] > cnt_team)
					cnt_team = t[j];
			}
			for (int j = 0; j < L; j++) {
				if (conferences[i]==cnf_team[t[j]]) {
					team[i] = t[j];
					break;
				}
			}
			ArrayList<Integer>rest = new ArrayList<>();
			if (team[i]==0) {
				for (int j = 0; j < L; j++) {
					if (cnf_team[t[j]]==0) {
						rest.add(t[j]);
					}
				}
				int x = rest.get(rm.nextInt(rest.size()));
				cnf_team[x] = conferences[i];
				team[i] = x;
			}
		}
		for (int i = 1; i <= n; i++) {
			pw.print(team[i]+" ");
		}
		pw.println();
		for (int i = 1; i <= cnt_team; i++) {
			if (cnf_team[i]==0)
				cnf_team[i] = 1;
			pw.print(cnf_team[i]+" ");
		}
		pw.close();
	}
	private static int nextInt() throws IOException {
		return Integer.parseInt(next());
	}
	private static long nextLong() throws IOException {
		return Long.parseLong(next());
	}
	private static double nextDouble() throws IOException {
		return Double.parseDouble(next());
	}
	private static String next() throws IOException {
		while (st==null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}
}