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
#include<cstdio>
#include<vector>
#include <algorithm>

using namespace std;

vector<int> curr_conn;

int delete_vertex(int i,vector<int> * w,int d)
{
    vector<int> new_w=w[i];
    w[i].clear();

    for(int j=0;j<new_w.size();j++)
    {
        //Usuwamy informacje o sasiedztwie z usuwanym wierzcholkiem
        for(int k=0;k<w[new_w[j]].size();k++)
        {
            if(w[new_w[j]][k]==i) w[new_w[j]].erase(w[new_w[j]].begin()+k);

        }

    }

    for(int j=0;j<new_w.size();j++)
    {

        for(int k=0;k<w[new_w[j]].size();k++)
        {
            if(w[new_w[j]].size()<d) delete_vertex(new_w[j],w,d);

        }

    }

    return 0;
}

int dfs(int i,int * visited, vector<int> * w)
{
    visited[i]=1;
    curr_conn.push_back(i);
    for(int j=0;j<w[i].size();j++)
    {
        if(visited[w[i][j]]==0) dfs(w[i][j],visited,w);
    }
}

int main()
{
    int m,n,d,a_i,b_i;


    scanf("%d",&n);
    scanf("%d",&m);
    scanf("%d",&d);

    vector<int> v[n+1];

    //Wczytywanie danych
    while(m>0)
    {
        scanf("%d",&a_i);
        scanf("%d",&b_i);
        v[a_i].push_back(b_i);
        v[b_i].push_back(a_i);
        m--;
    }


    //Kaskadowe usuwanie wierzcholkow o niskich stopniach

    for(int i=1;i<=n;i++)
    {
        if(v[i].size()<d)delete_vertex(i,v,d);
    }

    //Szukanie maksymalnej spojnej skladowej

    int max_conn_n=0;
    vector<int> max_conn;

    int visited[n+1];
    for(int i=1;i<=n;i++) visited[i]=0;

    for(int i=1;i<=n;i++)
    {
        if(visited[i]==0) dfs(i,visited,v);


        if(curr_conn.size()>max_conn_n)
        {
            max_conn_n=curr_conn.size();
            max_conn=curr_conn;
        }

        curr_conn.clear();
    }

    sort(max_conn.begin(),max_conn.end());

    if(max_conn_n==1) printf("NIE");
    else
    {
    printf("%d\n",max_conn_n);

    for(int i=0;i<max_conn.size();i++)
    {
        printf("%d  ",max_conn[i]);
    }

    }

/*
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=v[i].size();j++)
        printf("%d --- %d    ",i,v[i][j-1]);
        printf("\n");
    }
*/
    return 0;
}