아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

문제 선택

시간 제한2초메모리 제한256 MB

요약
난이도마다 문제를 하나씩 골라 m개 주제가 모두 정확히 한 번씩 나타나도록 하는 문제 집합을 찾는다.
난이도

어려움10점 중 8점

유형
백트래킹, 비트 연산, 동적 계획법, 완전 탐색
정답자
아직 제출이 없습니다

문제

프로그래밍 대회를 준비할 때 주최자가 마주치는 문제 중 하나는 그 대회에 넣을 문제를 고르는 일이다. 대회를 재미있게 만들려면 문제들의 난이도가 서로 달라야 한다. 또한 문제들이 서로 다른 주제를 다뤄야 한다. 같은 문제만 계속 푸는 것이 누구에게 재미있겠는가? 다행히 주최자에게는 문제가 많이 있고, 그중에서 고를 수 있다.

여러분에게 여러 문제가 있다. 각 문제마다 난이도가 정수로 주어지고, 어떤 주제를 다루는지도 알려져 있다. 다음 조건을 만족하도록 문제의 부분집합을 골라야 한다.

  • 각 난이도마다 정확히 하나의 문제를 고른다.
  • 모든 주제가 나타난다.
  • 어떤 두 문제도 주제가 겹치지 않는다.

가지고 있는 문제들로 위 조건을 만족하는 대회 문제 집합을 만들어라.

입력

첫째 줄에 세 정수 n (1 ≤ n ≤ 300), d (1 ≤ d ≤ 50), m (1 ≤ m ≤ 18)이 주어진다. n은 문제의 수, d는 난이도의 수, m은 서로 다른 주제의 수이다. 이어서 n개의 줄에 각 문제의 설명이 주어진다.

각 문제는 ci ki ti1 ti2 ... tiki 형식으로 주어진다. ci (1 ≤ ci ≤ d)는 i번째 문제의 난이도, ki (0 ≤ ki ≤ m)는 이 문제가 다루는 주제의 수, tij (1 ≤ tij ≤ m)는 i번째 문제가 다루는 주제이다. 한 문제 안에서 모든 tij는 서로 다르다.

출력

조건을 만족하는 문제 집합을 찾았으면 첫째 줄에 «OK»를, 찾지 못했으면 «Impossible»을 출력한다. 답이 있으면 다음 줄에 그 집합에 들어가는 문제의 번호 d개를 출력한다.

예제1

  1. 예제 1

    입력
    4 2 3
    1 1 1
    1 2 1 2
    2 2 1 2
    2 2 2 3
    
    예상 출력
    OK
    1 4