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 <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

const int size=200005;
vector <int> g[size];
queue <int> kol;
bool usuniete[size];
int ilesasiadow[size];
int d;
int numerskladowej=0;
vector <int> skladowe[size];
void usun(int w)
	{
//	cout<<"w:"<<w<<endl;
	usuniete[w]=1;
	for(int i=0;i<g[w].size();i++)
		{
		int v=g[w][i];
	//	cout<<"usuniete["<<v<<"]:"<<usuniete[v]<<endl;
		if(usuniete[v]==0)
			{
			ilesasiadow[v]--;	
		//	cout<<"v:"<<v<<" ilesasiadow[v]:"<<ilesasiadow[v]<<endl;
			if(ilesasiadow[v]<d)
				{
		//		cout<<"usun:"<<v<<endl;	
				usuniete[v]=1;
				usun(v);
				}
			}
		}
	}
int bfs(int w)
	{int ilewierzcholkow=1;
	usuniete[w]=1;
	kol.push(w);
	skladowe[numerskladowej].push_back(w);
	while(!kol.empty())
		{
		for(int i=0;i<g[kol.front()].size();i++)
			{
			int v=g[kol.front()][i];	
			if(usuniete[v]==0)
				{
				skladowe[numerskladowej].push_back(v);	
				kol.push(v);
				usuniete[v]=1;
				ilewierzcholkow++;
				}	
			}
		kol.pop();
		}	
	return ilewierzcholkow;	
	}

int main() {
ios_base::sync_with_stdio(0);

int n,m;
cin>>n>>m>>d;
int a,b;
for(int i=1;i<=m;i++)
	{
	cin>>a>>b;
//	cout<<a<<" "<<b<<endl;
	g[a].push_back(b);
	g[b].push_back(a);	
	}
for(int i=1;i<=n;i++)//ile sasiadow dany wierzcholek
	{
	ilesasiadow[i]=g[i].size();	
	}
//wypisywanie	
/*for(int i=1;i<=n;i++)
	{cout<<i<<": ";
	for(int j=0;j<g[i].size();j++)
		{
		cout<<g[i][j]<<" ";
		}
	cout<<endl;	
	}	
for(int i=1;i<=n;i++)
	{
	cout<<"ilesasiadow["<<i<<"]="<<ilesasiadow[i]<<" "<<endl;
	}*/

//koniec wypisywania	
for(int i=1;i<=n;i++)
	{
	if(ilesasiadow[i]<d&&usuniete[i]==0)
		usun(i);	
	}
//liczenie najwiekszej spojnej skladowej
int maksi=0;
int ktoraskladowanajlepsza=0;
for(int i=1;i<=n;i++)
	{
	if(!usuniete[i]==1)
		{
		int t=bfs(i);	
		if(t>maksi)
			{
			maksi=t;
			ktoraskladowanajlepsza=numerskladowej;	
			}	
	//	cout<<"i: "<<i<<"bfs(i)"<<t<<endl;
		numerskladowej++;
		}	
	}
if(maksi==0)
	cout<<"NIE"<<endl;
else			
	{
	cout<<maksi<<endl;	
	for(int i=0;i<skladowe[ktoraskladowanajlepsza].size();i++)
		cout<<skladowe[ktoraskladowanajlepsza][i]<<" ";
	}
return 0;
}