#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>

//#define DBG

using namespace std;

int n, m, d;

struct Miasto {
  bool ok; // czy jeszcze brane pod uwagę
  vector<int> drogi;
  int ile; // liczba dróg do miast branych pod uwagę
};

vector<Miasto> miasta;

///////////////////////////////////////////////////////////////////////////////

void licz()
{
  int i, j;
  set<pair<int, int> > pq;  // (liczba dróg, numer miasta)

  for(i = 0; i < n; ++i) {  // wrzucić wszystkie miasta do pq
    miasta[i].ok = true;
    miasta[i].ile = miasta[i].drogi.size();
    pq.insert(pair<int, int>(miasta[i].ile, i));
  }

  // wybrać miasta o najmniejszej liczbie dróg do dobrych miast i jeśli to mniej niż d to wyrzucić
  while(pq.size()) {
    set<pair<int, int> >::iterator it = pq.begin();
    if (it->first >= d) break;  // pozostały same miasta o liczbie dróg >= d
    int nr = it->second;
    miasta[nr].ok = false;
    pq.erase(it);
    // usuń drogi
    for (i = 0; i < miasta[nr].drogi.size(); ++i) {
      int cel = miasta[nr].drogi[i];
      if (miasta[cel].ok) {
        // poprawić liczbę dróg w pq dla miasta docelowego
        pq.erase(pair<int, int>(miasta[cel].ile, cel));
        miasta[cel].ile--;
        pq.insert(pair<int, int>(miasta[cel].ile, cel));
      }
    }
  }

  #ifdef DBG
  for (i = 0; i < n; ++i) printf("%d:(ok=%d, ile=%d)\n", i, (int)miasta[i].ok, miasta[i].ile);
  #endif // DBG

  vector<int> best;  // największa grupa miast

  for (i = 0; i < n; ++i) if (miasta[i].ok) {
    vector<int> kand; // kandydat na poprawę wyniku
    queue<int> q;     // miasta do odwiedzenia (BSF)

    q.push(i);
    miasta[i].ok = false;

    while (q.size()) {
      int nr = q.front();
      kand.push_back(nr);  // kolejne miasto w aktualnej grupie
      q.pop();
      for (j = 0; j < miasta[nr].drogi.size(); ++j) {
        int cel = miasta[nr].drogi[j];
        if (miasta[cel].ok) {
          miasta[cel].ok = false;
          q.push(cel);
        }
      }
    }
    if (kand.size() > best.size()) best = kand;
  }

  if (best.size()) {
    sort(best.begin(), best.end());
    printf("%d\n", best.size());
    for (i = 0; i < best.size(); ++i) printf("%d ", best[i] + 1);
    printf("\n");
  }
  else
    printf("NIE\n");
}


///////////////////////////////////////////////////////////////////////////////

void czytaj()
{
  int i, a, b;
  scanf("%d%d%d", &n, &m, &d);
  for (i = 0; i < n; ++i) {
    Miasto m;
    miasta.push_back(m);
  }
  for (i = 0; i < m; ++i) {
    scanf("%d%d", &a, &b);
    miasta[a - 1].drogi.push_back(b - 1);
    miasta[b - 1].drogi.push_back(a - 1);
  }
}


int main()
{
  czytaj();
  licz();
  return 0;
}
