#include <bits/stdc++.h>
using namespace std;
using ll=long long;
struct edge{
int a;
int b;
bool active=true;
};
int n,m,k;
vector<edge> edges;
vector<vector<int>> adj;
vector<int> kifok;
vector<bool> done;
vector<bool> vis;
vector<vector<int>> ans;
int dfs(int node){
if (vis[node]) return 0;
vis[node]=true;
int ret=1;
ans.back().push_back(node);
for (int i : adj[node]){
if (edges[i].active){
if (edges[i].a!=node) swap(edges[i].a, edges[i].b);
ret+=dfs(edges[i].b);
}
}
return ret;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>m>>k;
adj.resize(n+1);
edges.resize(m);
kifok.resize(n+1);
done.resize(n+1, false);
vis.resize(n+1,false);
for (int i = 0; i < m; i++)
{
int a,b;
cin>>a>>b;
edges[i]={a,b};
adj[a].push_back(i);
adj[b].push_back(i);
kifok[a]++;
kifok[b]++;
}
priority_queue<array<int,2>, vector<array<int,2>>, greater<array<int,2>>> sor;
for (int i=1;i<=n;i++) sor.push({kifok[i],i});
while (sor.top()[0]<k){
auto [ki, node] = sor.top();
sor.pop();
if (done[node]) continue;
done[node]=true;
for (int i : adj[node]){
edge& el=edges[i];
if(!el.active) continue;
kifok[el.a]--;
kifok[el.b]--;
el.active=false;
if (!done[el.a]) sor.push({kifok[el.a], el.a});
if (!done[el.b]) sor.push({kifok[el.b], el.b});
}
}
int ma=INT_MIN,maxi=-1;
for (int i=1;i<=n;i++) {
if (!done[i] && !vis[i]) {
ans.push_back({});
int si=dfs(i);
ma=max(ma,si);
maxi=(ma=si) ? ans.size()-1 : maxi;
}
}
if (maxi==-1){
cout<<"0";
return 0;
}
cout<<ans[maxi].size()<<"\n";
sort(ans[maxi].begin(), ans[maxi].end());
for (int i : ans[maxi]) cout<<i<<" ";
}