#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct node {
int data, no;
node *next;
} *ge1[1000000], *ge2[1000000];
int dfn[1000000], low[1000000], up[1000000], queue[1000000], flag[1000000], e[2000000][2];
bool bridge[2000000], del[2000000];
int bufTop = 0, k;
void insertEdge(node *ge[], int a, int b, int c) {
static node buf[4000000];
node *p = &buf[bufTop ++];
p->data = b;
p->no = c;
p->next = ge[a];
ge[a] = p;
}
void dfs(int i) {
static int top = 0;
dfn[i] = low[i] = top ++;
for (node *p = ge1[i]; p; p = p->next) {
if (p->data < k) continue;
if (dfn[p->data] == -1) {
up[p->data] = p->no;
dfs(p->data);
low[i] = min(low[i], low[p->data]);
if (low[p->data] > dfn[i]) bridge[p->no] = true;
} else if (p->no != up[i]) {
low[i] = min(low[i], dfn[p->data]);
}
}
}
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < n; i ++) ge1[i] = 0;
for (int i = 0; i < m; i ++) {
scanf("%d%d", &e[i][0], &e[i][1]);
e[i][0] --;
e[i][1] --;
insertEdge(ge1, e[i][0], e[i][1], i);
insertEdge(ge1, e[i][1], e[i][0], i);
}
memset(dfn, -1, sizeof(dfn));
memset(bridge, false, sizeof(bridge));
for (int i = k; i < n; i ++)
if (dfn[i] == -1) {
up[i] = -1;
dfs(i);
}
memset(flag, -1, sizeof(flag));
for (int i = 0; i < k; i ++) flag[i] = i;
int tot = k;
for (int i = k; i < n; i ++)
if (flag[i] == -1) {
flag[i] = tot;
queue[0] = i;
for (int head = 0, tail = 1; head < tail; head ++)
for (node *p = ge1[queue[head]]; p; p = p->next)
if (p->data >= k && ! bridge[p->no] && flag[p->data] == -1) {
flag[p->data] = tot;
queue[tail ++] = p->data;
}
tot ++;
}
for (int i = 0; i < tot; i ++) ge2[i] = 0;
bufTop = 0;
for (int i = 0; i < m; i ++)
if (flag[e[i][0]] != flag[e[i][1]]) {
insertEdge(ge2, flag[e[i][0]], flag[e[i][1]], i);
insertEdge(ge2, flag[e[i][1]], flag[e[i][0]], i);
}
memset(del, false, sizeof(del));
memset(up, -1, sizeof(up));
for (int i = 0; i < tot; i ++)
if (up[i] == -1) {
queue[0] = i;
for (int head = 0, tail = 1; head < tail; head ++)
for (node *p = ge2[queue[head]]; p; p = p->next)
if (up[p->data] == -1 && p->data != i) {
up[p->data] = p->no;
queue[tail ++] = p->data;
} else if (p->no != up[queue[head]]) {
del[p->no] = true;
}
}
int cnt = 0;
for (int i = 0; i < m; i ++)
if (del[i]) cnt ++;
printf("%d\n", cnt);
for (int i = 0; i < m; i ++)
if (del[i]) printf("%d %d\n", e[i][0] + 1, e[i][1] + 1);
return 0;
}
CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGlvPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBub2RlIHsKCWludCBkYXRhLCBubzsKCW5vZGUgKm5leHQ7Cn0gKmdlMVsxMDAwMDAwXSwgKmdlMlsxMDAwMDAwXTsKCmludCBkZm5bMTAwMDAwMF0sIGxvd1sxMDAwMDAwXSwgdXBbMTAwMDAwMF0sIHF1ZXVlWzEwMDAwMDBdLCBmbGFnWzEwMDAwMDBdLCBlWzIwMDAwMDBdWzJdOwpib29sIGJyaWRnZVsyMDAwMDAwXSwgZGVsWzIwMDAwMDBdOwppbnQgYnVmVG9wID0gMCwgazsKCnZvaWQgaW5zZXJ0RWRnZShub2RlICpnZVtdLCBpbnQgYSwgaW50IGIsIGludCBjKSB7CglzdGF0aWMgbm9kZSBidWZbNDAwMDAwMF07Cglub2RlICpwID0gJmJ1ZltidWZUb3AgKytdOwoJcC0+ZGF0YSA9IGI7CglwLT5ubyA9IGM7CglwLT5uZXh0ID0gZ2VbYV07CglnZVthXSA9IHA7Cn0KCnZvaWQgZGZzKGludCBpKSB7CglzdGF0aWMgaW50IHRvcCA9IDA7CglkZm5baV0gPSBsb3dbaV0gPSB0b3AgKys7Cglmb3IgKG5vZGUgKnAgPSBnZTFbaV07IHA7IHAgPSBwLT5uZXh0KSB7CgkJaWYgKHAtPmRhdGEgPCBrKSBjb250aW51ZTsKCQlpZiAoZGZuW3AtPmRhdGFdID09IC0xKSB7CgkJCXVwW3AtPmRhdGFdID0gcC0+bm87CgkJCWRmcyhwLT5kYXRhKTsKCQkJbG93W2ldID0gbWluKGxvd1tpXSwgbG93W3AtPmRhdGFdKTsKCQkJaWYgKGxvd1twLT5kYXRhXSA+IGRmbltpXSkgYnJpZGdlW3AtPm5vXSA9IHRydWU7CgkJfSBlbHNlIGlmIChwLT5ubyAhPSB1cFtpXSkgewoJCQlsb3dbaV0gPSBtaW4obG93W2ldLCBkZm5bcC0+ZGF0YV0pOwoJCX0KCX0KfQoKaW50IG1haW4oKSB7CglpbnQgbiwgbSwgazsKCXNjYW5mKCIlZCVkJWQiLCAmbiwgJm0sICZrKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSArKykgZ2UxW2ldID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSArKykgewoJCXNjYW5mKCIlZCVkIiwgJmVbaV1bMF0sICZlW2ldWzFdKTsKCQllW2ldWzBdIC0tOwoJCWVbaV1bMV0gLS07CgkJaW5zZXJ0RWRnZShnZTEsIGVbaV1bMF0sIGVbaV1bMV0sIGkpOwoJCWluc2VydEVkZ2UoZ2UxLCBlW2ldWzFdLCBlW2ldWzBdLCBpKTsKCX0KCQoJbWVtc2V0KGRmbiwgLTEsIHNpemVvZihkZm4pKTsKCW1lbXNldChicmlkZ2UsIGZhbHNlLCBzaXplb2YoYnJpZGdlKSk7Cglmb3IgKGludCBpID0gazsgaSA8IG47IGkgKyspCgkJaWYgKGRmbltpXSA9PSAtMSkgewoJCQl1cFtpXSA9IC0xOwoJCQlkZnMoaSk7CgkJfQoJCgltZW1zZXQoZmxhZywgLTEsIHNpemVvZihmbGFnKSk7Cglmb3IgKGludCBpID0gMDsgaSA8IGs7IGkgKyspIGZsYWdbaV0gPSBpOwoJaW50IHRvdCA9IGs7Cglmb3IgKGludCBpID0gazsgaSA8IG47IGkgKyspCgkJaWYgKGZsYWdbaV0gPT0gLTEpIHsKCQkJZmxhZ1tpXSA9IHRvdDsKCQkJcXVldWVbMF0gPSBpOwoJCQlmb3IgKGludCBoZWFkID0gMCwgdGFpbCA9IDE7IGhlYWQgPCB0YWlsOyBoZWFkICsrKQoJCQkJZm9yIChub2RlICpwID0gZ2UxW3F1ZXVlW2hlYWRdXTsgcDsgcCA9IHAtPm5leHQpCgkJCQkJaWYgKHAtPmRhdGEgPj0gayAmJiAhIGJyaWRnZVtwLT5ub10gJiYgZmxhZ1twLT5kYXRhXSA9PSAtMSkgewoJCQkJCQlmbGFnW3AtPmRhdGFdID0gdG90OwoJCQkJCQlxdWV1ZVt0YWlsICsrXSA9IHAtPmRhdGE7CgkJCQkJfQoJCQl0b3QgKys7CgkJfQoJCglmb3IgKGludCBpID0gMDsgaSA8IHRvdDsgaSArKykgZ2UyW2ldID0gMDsKCWJ1ZlRvcCA9IDA7Cglmb3IgKGludCBpID0gMDsgaSA8IG07IGkgKyspCgkJaWYgKGZsYWdbZVtpXVswXV0gIT0gZmxhZ1tlW2ldWzFdXSkgewoJCQlpbnNlcnRFZGdlKGdlMiwgZmxhZ1tlW2ldWzBdXSwgZmxhZ1tlW2ldWzFdXSwgaSk7CgkJCWluc2VydEVkZ2UoZ2UyLCBmbGFnW2VbaV1bMV1dLCBmbGFnW2VbaV1bMF1dLCBpKTsKCQl9CgkKCW1lbXNldChkZWwsIGZhbHNlLCBzaXplb2YoZGVsKSk7CgltZW1zZXQodXAsIC0xLCBzaXplb2YodXApKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgdG90OyBpICsrKQoJCWlmICh1cFtpXSA9PSAtMSkgewoJCQlxdWV1ZVswXSA9IGk7CgkJCWZvciAoaW50IGhlYWQgPSAwLCB0YWlsID0gMTsgaGVhZCA8IHRhaWw7IGhlYWQgKyspCgkJCQlmb3IgKG5vZGUgKnAgPSBnZTJbcXVldWVbaGVhZF1dOyBwOyBwID0gcC0+bmV4dCkKCQkJCQlpZiAodXBbcC0+ZGF0YV0gPT0gLTEgJiYgcC0+ZGF0YSAhPSBpKSB7CgkJCQkJCXVwW3AtPmRhdGFdID0gcC0+bm87CgkJCQkJCXF1ZXVlW3RhaWwgKytdID0gcC0+ZGF0YTsKCQkJCQl9IGVsc2UgaWYgKHAtPm5vICE9IHVwW3F1ZXVlW2hlYWRdXSkgewoJCQkJCQlkZWxbcC0+bm9dID0gdHJ1ZTsKCQkJCQl9CgkJfQoJCglpbnQgY250ID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSArKykKCQlpZiAoZGVsW2ldKSBjbnQgKys7CglwcmludGYoIiVkXG4iLCBjbnQpOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpICsrKQoJCWlmIChkZWxbaV0pIHByaW50ZigiJWQgJWRcbiIsIGVbaV1bMF0gKyAxLCBlW2ldWzFdICsgMSk7CgkKCXJldHVybiAwOwp9Cg==