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.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.Random;

/**
 * Created by DNs on 15.05.2016.
 */
public class Main implements Runnable {
  static BufferedReader in;
  static PrintWriter out;
  static StringTokenizer tok = new StringTokenizer("");

  public static void main(String[] args) {
    new Thread(new Main()).start();
  }

  @Override
  public void run() {
    Locale.setDefault(Locale.ENGLISH);
    try {
      init();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    try {
      solve();
    } catch (IOException e) {
      e.printStackTrace();
    }
    out.close();
  }


  private String readString() {
    while (!tok.hasMoreTokens()) {
      try {
        tok = new StringTokenizer(in.readLine());
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return tok.nextToken();
  }

  private Integer readInt() {
    return Integer.parseInt(readString());
  }

  private Long readLong() {
    return Long.parseLong(readString());
  }

  private Double readDouble() {
    return Double.parseDouble(readString());
  }

  private void init() throws FileNotFoundException {
    in = new BufferedReader(new InputStreamReader(System.in));
    out = new PrintWriter(System.out);
    /*in = new BufferedReader(new FileReader("stupid_rmq.in"));
    out = new PrintWriter("stupid_rmq.out");*/
  }

  
  int T = 1_000_001;

  private void solve() throws IOException {
    int n = readInt();
    int e = readInt();
    ArrayList<Integer> trainersToTeams[]  = new ArrayList[n];
    Pair[] haters = new Pair[e];
    for (int i = 0; i < n; i++) {
      trainersToTeams[i] = new ArrayList<>();
    }
    for (int i = 0; i < e; i++) {
      int first = readInt() - 1;
      int second = readInt() - 1;
      haters[i] = new Pair(first, second);
    }
    int maxTeam = 0;
    for (int i = 0; i < n; i++) {
      int countTeams = readInt();
      for (int j = 0; j < countTeams; j++) {
        int team = readInt() - 1;
        maxTeam = Math.max(maxTeam, team);
        trainersToTeams[i].add(team);
      }
    }
    maxTeam++;
    Random rnd = new Random();
    while(true){
      int[] trainerTeam = new int[n];
      for(int i = 0; i < n; i++){
        trainerTeam[i] = trainersToTeams[i].get(Math.abs(rnd.nextInt()) % trainersToTeams[i].size());
      }
      boolean[] isFirstConference = new boolean[maxTeam];
      for(int i = 0; i < maxTeam; i++){
        if(rnd.nextInt()%2 == 0) isFirstConference[i] = true;
      }
      int count = 0;
      for(int i = 0; i < e; i++){
        int firstTeam = trainerTeam[haters[i].x];
        int secondTeam = trainerTeam[haters[i].y];
        if((isFirstConference[firstTeam] ^ isFirstConference[secondTeam]))count++;
      }
      if(count*2 >= e){
        for(int i = 0; i < n; i++){
          out.print(trainerTeam[i] + 1 + " ");
        }
        out.println();
        for(int i = 0; i < maxTeam; i++){
          if(isFirstConference[i]) out.print("1 "); else out.print("2 ");
         // out.print((isFirstConference[i] ? "1 " : "2 "));
        }
        return;
      }
    }
  }
  
  class Pair{
      int x, y;
      public Pair(int x, int y){
          this.x = x;
          this.y = y;
      }
  }


}