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
128
129
130
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <ctime>
#include <iostream>
#include <deque>
using namespace std;

using Elem = set<int>;
vector<Elem> cities;
vector<vector<int>> tmpData;
std::vector<int> best_result;
std::vector<int> result;
std::vector<int> status;
queue<int> q;

void dfs(int id)
{
	result.clear();
	status[id] = 1;
	q.push(id);

	while (!q.empty())
	{
		int val = q.front();
		q.pop();

		result.push_back(val);

		for (auto new_id : cities[val])
		{
			if (!status[new_id])
			{
				status[new_id] = 1;
				q.push(new_id);
			}
		}
	}
}

void connect(int a, int b)
{
	tmpData[a].push_back(b);
	tmpData[b].push_back(a);
}

int main()
{
	int n, m, d;
	scanf("%d %d %d", &n, &m, &d);
	cities.resize(n + 1);
	tmpData.resize(n + 1);
	for (int i = 0; i < m; ++i)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		connect(a, b);
	}

	for (int i = 0; i < n; ++i)
		cities[i].insert(tmpData[i].begin(), tmpData[i].end());

	queue<int> toProcess;
	vector<bool> processing;
	processing.resize(n + 1);
	for (int i = 1; i <= n; ++i)
	{
		toProcess.push(i);
		processing[i] = true;
	}

	while (!toProcess.empty())
	{
		int id = toProcess.front();
		toProcess.pop();

		int size = cities[id].size();
		if (size < d && size > 0)
		{
			for (auto city : cities[id])
			{
				if (city != id)
				{
					cities[city].erase(id);
					if (!processing[city])
					{
						toProcess.push(city);
						processing[city] = true;
					}
				}
			}

			cities[id].clear();
		}

		processing[id] = false;
	}

	status.clear();
	status.resize(n + 1);

	for (int i = 1; i <= n; ++i)
	{
		if (status[i] == 0 && cities[i].size() > 0)
		{
			dfs(i);
			if (result.size() > best_result.size())
				best_result = result;
		}
	}

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

	if (best_result.empty())
	{
		puts("NIE");
	}
	else
	{
		printf("%d\n", result.size());
		for (int i : best_result)
			printf("%d ", i);
		printf("\n");
	}

	return 0;
}