1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//
//  main.cpp
//  mistrzostwa
//
//  Created by Marcin Wierzbicki on 29.09.2015.
//

#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <bitset>

using namespace std;
bitset<200000> bylo;
int liczkraw[200000];
vector<int> wierzcholki[200000];
vector<int> obecnaspoj;
vector<int> maxspoj;

void sprawdz(int x) {
    obecnaspoj.push_back(x);
    bylo[x]=1;
    for (int j=0; j<wierzcholki[x].size(); j++) {
        if (bylo[wierzcholki[x][j]]==0) {
            sprawdz(wierzcholki[x][j]);
        }
    }
}

void dfs(int n) {
    for (int k=0; k<n; k++) {
        if (bylo[k]==0) {
            sprawdz(k);
            if (obecnaspoj.size()>maxspoj.size()) {
                swap(obecnaspoj, maxspoj);
            }
            obecnaspoj.clear();
        }
    }
}

void lecimy(int n, int d) {
    if (bylo[n]==0) {
        if (liczkraw[n]<d) {
            bylo[n]=1;
            for (int j=0; j<wierzcholki[n].size(); j++) {
                liczkraw[wierzcholki[n][j]]--;
                if (bylo[wierzcholki[n][j]]==0) {
                    lecimy(wierzcholki[n][j],d);
                }
            }
        }
    }
}

int main() {
    int n,m,d,a,b;
    scanf("%d %d %d",&n,&m,&d);
    //vector<int> wierzcholki[n];
    //queue<int> dospr;
    for (int i=0; i<m; i++) {
        scanf("%d %d",&a,&b);
        wierzcholki[a-1].push_back(b-1);
        wierzcholki[b-1].push_back(a-1);
    }
    for (int i=0; i<n; i++) {
        liczkraw[i]=wierzcholki[i].size();
        
        /*printf("g%d: ",i);
        for (int j=0; j<wierzcholki[i].size(); j++) {
            printf("%d ",wierzcholki[i][j]);
        }
        printf(" liczkraw[%d]: %d\n",i,liczkraw[i]);*/
        
    }
    /*for (int i=0; i<n; i++) {
        if (liczkraw[i]<d) {
            bylo[i]=1;
            for (int j=0; j<wierzcholki[i].size(); j++) {
                liczkraw[wierzcholki[i][j]]--;
                if (bylo[wierzcholki[i][j]]==0) {
                    dospr.push(wierzcholki[i][j]);
                }
            }
        }
    }
    while(dospr.size()>0) {
        a=dospr.front();
        if (liczkraw[a]<d) {
            bylo[a]=1;
            for (int j=0; j<wierzcholki[a].size(); j++) {
                liczkraw[wierzcholki[a][j]]--;
                if (bylo[wierzcholki[a][j]]==0) {
                    dospr.push(wierzcholki[a][j]);
                }
            }
        }
        dospr.pop();
    }*/
    for (int i=0; i<n; i++) {
        if (bylo[i]==0) {
           lecimy(i, d);
        }
    }
    if (bylo.count()==n) {
        printf("NIE");
        return 0;
    }
    /*printf("%d\n",bylo.count());
    for (int i=0; i<n; i++) {
        if (bylo[i]==1) {
            printf("%d",1);
        }
        else {
            printf("%d",0);
        }
    }*/
    dfs(n);
    sort(maxspoj.begin(), maxspoj.end());
    printf("%lu\n",maxspoj.size());
    for (int i=0; i<maxspoj.size(); i++) {
        printf("%d ",maxspoj[i]+1);
    }
    //wynik = max zbior z dfsa
    return 0;
}