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

using std::printf;
using std::scanf;
using std::set;
using std::sort;

int n, m, d;
set<int> nodes[200005];
int groups[200005] = { 0 };

int flood(int id, int group)
{
  if (groups[id])
    return 0;

  groups[id] = group;

  int sum = 1;
  for (set<int>::iterator it = nodes[id].begin(); it != nodes[id].end(); it++)
    sum += flood(*it, group);

  return sum;
}

void floodRemove(int id)
{
  if (groups[id] == -1 || nodes[id].size() >= d)
    return;

  groups[id] = -1;

  for (set<int>::iterator it = nodes[id].begin(); it != nodes[id].end(); it++)
  {
    nodes[*it].erase(id);
    floodRemove(*it);
  }

  nodes[id].clear();
}

int main()
{
  scanf("%d%d%d", &n, &m, &d);
  int a, b;
  while (m--)
  {
    scanf("%d%d", &a, &b);
    nodes[a].insert(b);
    nodes[b].insert(a);
  }

  for (int id = 1; id <= n; id++)
    floodRemove(id);

  int maxSize = 0;
  int maxNode;
  for (int id = 1; id <= n; id++)
  {
    int sum = flood(id, id);
    if (sum > maxSize)
    {
      maxSize = sum;
      maxNode = id;
    }
  }

  if (maxSize == 0)
    printf("NIE\n");
  else
  {
    printf("%d\n", maxSize);
    for (int id = 1; id <= n; id++)
      if (groups[id] == maxNode)
        printf("%d ", id);
    printf("\n");
  }

  return 0;
}