#include <iostream>
#include <vector>
using namespace std;
int n,m; // تعداد یال‌ها m تعداد راس‌ها و n
const int N=1000; // ثابتی برای مشخص کردن سقف تعداد راس‌ها
vector <int>g[N]; // محل ذخیره‌یال‌ها
vector <int> bg[N]; // محل ذخیره معکوس یال‌ها
vector <int> myStack; // پشته‌ای که راس‌ها در هنگام خروج در پیمایش اول در آن می‌ریزیم
int comps; // تعداد مولفه‌ها در آخر
bool used[N]; // علامتی برای اینکه مشخص شود راسی دیده‌شده‌یا نه
void dfs(int a){ // پیمایش اول
	used[a]=true;
	for(int i=0; i<g[a].size(); i++)
		if(!used[g[a][i]])
			dfs(g[a][i]);
	myStack.push_back(a);
	return;
}
void back_dfs(int a){ // پیمایش دوم روی گراف معکوس
	cout << a+1<<" ";
	used[a]=true;
	for(int i=0; i<bg[a].size(); i++)
		if(!used[bg[a][i]])
			back_dfs(bg[a][i]);
}
void find_comps(){ 
	fill_n(used,n,false);
	comps=0;
	for(int i=0; i<n; i++)
		if(!used[i])
			dfs(i);
	fill_n(used,n,false);
	while(myStack.size()!=0){
		// میریزد و آنرا از پشته حذف می‌کند v دو خط بعدی بالاترین عضو پشته را در متغیر
		myStack.pop_back(); 
		int v=*(myStack.end()); 
		if(!used[v]){
			cout << ++comps<<": ";
			back_dfs(v);
			cout << endl;
		}
	}
}

int main(){
	cin >> n>>m;
	for(int i=0; i<m; i++){
		int a,b;
		cin >>a>>b;
		g[a-1].push_back(b-1);
		bg[b-1].push_back(a-1);
		/* است n-1 بازه‌ی معتبر راس‌ها برای برنانه صفر تا
		 * می‌باشد به همین n اما بازه‌ی معتبر ورودی یک تا
 * دلیل قبل از ذخیره‌یکی از ورودی‌ها کم می‌کنیم		
		 */
	}
	find_comps();
	return 0;
}