#include <stdafx.h>

#include <string.h>


#include <iostream>


using namespace     std;


#define MAX         1000

typedef int         type;


int N, M, C, V;


type                sequence[MAX];

int                 seqIndex;


void printSequence()

{

    int iEnd = N - 1;

    for(int i = 0; i < iEnd; ++i)

        cout << sequence[i] << " ";

    cout << sequence[iEnd];

}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


class TSubSeq

{

public:

    type*           head;

    type            last;

    /*con*/         TSubSeq() {}

    /*des*/         ~TSubSeq() { delete[] head; }

    void            read()

    {

        head = new type[M];

        for(int i = 0; i < M; ++i)

            cin >> head[i];

        last = head[V];

    }

    void            putHead()

    {

        for(int i = 0; i < M; ++i)

            sequence[i] = head[i];

        seqIndex = M;

    }

    void            putLast()

    {

        sequence[seqIndex++] = last;

    }

    bool            matched()

    {

        type* tail = sequence + seqIndex - M + 1;

        for(int i = 0; i < V; ++i)

        {

            if(tail[i] != head[i]) return false;

        }

        return true;

    }

};


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


class Deck

{

protected:

    int             mCount;

public:

    TSubSeq*        buffer[MAX];

    /* con */       Deck() : mCount(0) {}

    void            add(TSubSeq* some)

    {

        buffer[mCount++] = some;        

    }

    int             indexOf(TSubSeq* some)

    {

        for(int i = 0; i < C; ++i)

        {

            if(buffer[i] == some) return i;

        }

        return -1;

    }

    TSubSeq*        pop(int index)

    {

        mCount--;

        TSubSeq* temp = buffer[index];

        buffer[index] = buffer[mCount];

        return buffer[mCount] = temp;

    }

    TSubSeq*        pop(TSubSeq* some)

    {

        return pop(indexOf(some));

    }

    int             count() { return mCount; }

    void            refill() { mCount = C; }

    void            reload(TSubSeq* some) { mCount++; }

};


TSubSeq             subSeqs[MAX];

Deck                deck;


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


void advanceFrom(TSubSeq* base)

{

    for(int i = deck.count() - 1; i >= 0; --i)

    {

        if(deck.buffer[i]->matched())

        {

            TSubSeq* next = deck.pop(i);

            next->putLast();

            advanceFrom(next);

            deck.reload(next);

            if(seqIndex == N)

                return;

            seqIndex--;

        }

    }

}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


void process()

{

    for(int i = 0; i < C; ++i)

        deck.add(subSeqs + i);

    for(int i = deck.count() - 1; i >= 0; --i)

    {

        TSubSeq* next = deck.pop(i);

        next->putHead();

        advanceFrom(next);

        deck.reload(next);

        if(seqIndex == N)

            return;

    }

}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


void readFile()

{

    cin >> N;

    cin >> M;


    C = N - M + 1;

    V = M - 1;

    for(int i = 0; i < C; ++i)

        subSeqs[i].read();

}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


int main(int argc, char* argv[])

{

#ifdef WIN32

    freopen("c:\input2.txt", "r", stdin);

#endif

    readFile();

    process();

    printSequence();

    return 0;

}


로컬이면 저런거 못 풀겠냐 문제 졸라 단순한데.

뭔가 놓친게 있는것 같긴 하군.