/*
TASK: zala
LANG: C++
*/
#include <vector>
#include <iostream>

using namespace std;

#define _MAX 50000

int v;
int e;
int r;
int count_;
int used[_MAX];
int postnum[_MAX];
vector<int> a[_MAX];
vector<int> t[_MAX];

void tree(int i)
{
	used[i] = 1;
	for (int k = 0; k < a[i].size(); k++)
	{
		if (!used[a[i][k]])
		{
			t[i].push_back(a[i][k]);
			t[a[i][k]].push_back(i);
			tree(a[i][k]);
		}
	}
}

void dfs(int i)
{
	used[i] = 2;
	for (int k = 0; k < a[i].size(); k++)
		if (used[a[i][k]] != 2)
			dfs(a[i][k]);
	postnum[i] = count_++;
}

void print(vector<int> a[])
{
	for (int i = 0; i < v; i++)
	{
		for (int j = 0; j < a[i].size(); j++)
			cout << a[i][j] << ' ';
		cout << endl;
	}
}

void init()
{
	int x;
	int y;
	cin >> v;
	cin >> e;
	for (int i = 0; i < e; i++)
	{
		cin >> x;
		cin >> y;
		a[x].push_back(y);
		a[y].push_back(x);
	}
}

void solve()
{
	
	dfs(0);
	for (int i = 0; i < v; i++)
	{
		
		for (int j = 0; j < a[i].size(); j++)
		{
			bool indent = false;
			for (int k = 0; k < a[j].size(); k++)
			{
				int p;
				for (p = 0; p < a[a[j][k]].size(); p++)
				{
					if (a[a[j][k]][p] == i)
					{
						indent = true;
						break;
					}
				}
				if (indent)
					break;
			}
			if (postnum[i] > postnum[a[i][j]] && !indent)
			{
				cout << i << ' ' << a[i][j] << endl;
				r++;
				break;
			}
		}
	}
	cout << r << endl;
}

int main()
{
	init();
	solve();
	
    return 0;
}
