#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N,M,K;
cin>>N>>M>>K;
vector<vector<int>>g(N+1),t(N+1);
vector<pair<int,int>>e;
for(int i=0;i<M;i++){
int a,b;
cin>>a>>b;
if(i<K){
t[a].push_back(b);
t[b].push_back(a);
e.emplace_back(a,b);
e.emplace_back(b,a);
}
else{
g[a].push_back(b);
g[b].push_back(a);
}
}
if(0){
start:
int TREE=0;
N=2+rand()%10,M=TREE?N-1:rand()%min(N*(N-1)/2,N*2),K=M==0?0:rand()%M;
struct DSU {
vector<int> v;
DSU(int n) : v(n + 1, -1) {
}
int find(int a) {
return v[a] < 0 ? a : v[a] = find(v[a]);
}
void unite(int a, int b) {
a = find(a);
b = find(b);
if (a == b) {
return;
}
if (v[a] > v[b]) {
swap(a, b);
}
v[a] += v[b];
v[b] = a;
}
};
DSU dsu(N+1);
g.clear();
g.resize(N+1);
t.clear();
t.resize(N+1);
e.clear();
set<pair<int,int>>s;
for(int i=0;i<M;i++){
int a,b;
do{
a=1+rand()%N,b=1+rand()%N;
}
while(a==b||s.count({a,b})||(TREE&&dsu.find(a)==dsu.find(b)));
s.insert({a,b});
s.insert({b,a});
dsu.unite(a,b);
if(i<K){
t[a].push_back(b);
t[b].push_back(a);
e.emplace_back(a,b);
e.emplace_back(b,a);
}
else{
g[a].push_back(b);
g[b].push_back(a);
}
}
}
vector<vector<pair<int,int>>>gg(N+1);
for(int i=1;i<=N;i++){
for(int j:g[i]){
gg[i].emplace_back(j,0);
}
for(int j:t[i]){
gg[i].emplace_back(j,1);
}
}
#define g gg
vector<int>v(N+1),w(N+1),u(N+1),p(N+1),ti(N+1),to(N+1);
vector<array<int,16>>up(N+1);
auto des=[&](int a,int b)->bool{
return ti[a]<=ti[b]&&to[a]>=to[b];
};
auto lca=[&](int a,int b)->int{
while(!des(a,b)){
for(int i=1;;i++){
if(des(up[a][i],b)){
a=up[a][i-1];
break;
}
}
}
return a;
};
auto lcb=[&](int a,int b)->int{
if(des(a,b)){
return -1;
}
while(!des(p[a],b)){
for(int i=1;;i++){
if(des(p[up[a][i]],b)){
a=up[a][i-1];
break;
}
}
}
return a;
};
int ta=1;
auto dfs=[&](auto self,int i)->void{
w[i]=i;
up[i][0]=p[i];
for(int j=1;j<16;j++){
up[i][j]=up[up[i][j-1]][j-1];
}
ti[i]=ta++;
for(auto[j,b]:g[i]){
if(v[j]){
if(v[j]<v[w[i]]){
w[i]=j;
}
continue;
}
v[j]=v[i]+1;
p[j]=i;
self(self,j);
if(v[w[j]]<v[w[i]]){
w[i]=w[j];
}
}
to[i]=ta++;
};
v[1]=1;
dfs(dfs,1);
ti[0]=0;
to[0]=ta;
auto dfs2=[&](auto self,int i)->void{
for(auto[j,b]:g[i]){
if(j==p[i]){
continue;
}
if(v[j]>v[i]+1){
continue;
}
if(v[j]<v[i]){
continue;
}
if(b){
u[j]=1;
}
self(self,j);
}
};
dfs2(dfs2,1);
auto dfs3=[&](auto self,int i,int b)->void{
u[i]|=b;
b|=u[i];
for(auto[j,x]:g[i]){
if(v[j]&&p[j]!=i){
continue;
}
v[j]=v[i]+1;
p[j]=i;
self(self,j,b|x);
}
};
dfs3(dfs3,1,0);
#undef g
if(0){
int st=clock();
vector<int>ans;
for(int i=1;i<=N;i++){
if(u[i])ans.push_back(i);
}
vector<int>v(N+1),u(N+1);
auto bt=[&](auto self,int i,int b)->void{
if(clock()>st+CLOCKS_PER_SEC/10){
return;
}
if(v[i]){
return;
}
if(b){
u[i]=1;
}
v[i]=1;
for(int j:g[i]){
self(self,j,b);
}
for(int j:t[i]){
self(self,j,1);
}
v[i]=0;
};
bt(bt,1,0);
if(clock()>st+CLOCKS_PER_SEC/10){
cout<<"TIMEOUT"<<endl;
goto start;
}
vector<int>ans1;
for(int i=1;i<=N;i++){
if(u[i]){
ans1.push_back(i);
}
}
if(ans1.size()!=ans.size()){
for(int i=1;i<=N;i++){
for(int j:g[i]){
if(j<i)continue;
cout<<i<<' '<<j<<' '<<0<<endl;
}
for(int j:t[i]){
if(j<i)continue;
cout<<i<<' '<<j<<' '<<1<<endl;
}
}
cout<<"============= GOT ============="<<endl;
cout<<ans.size()<<'\n';
for(int i:ans){
cout<<i<<' ';
}
cout<<'\n';
cout<<"============= EXP ============="<<endl;
cout<<ans1.size()<<'\n';
for(int i:ans1){
cout<<i<<' ';
}
cout<<'\n';
exit(1);
}
static int cc=0;
cout<<"OK "<<setw(9)<<cc++<<" "<<ans.size()<<endl;
goto start;
}
cout<<count(u.begin(),u.end(),1)<<'\n';
for(int i=1;i<=N;i++){
if(u[i]){
cout<<i<<' ';
}
}
cout<<'\n';
return 0;
}