#include <iostream>
#include <vector>
#include <algorithm>

int timestamp = 0;

struct Vertex {
	int id;
	int enter;
	int departure;
	std::vector<int> edge_to;
	Vertex() : enter(-1), departure(-1) {}
};
bool comp_v (const Vertex& u, const Vertex& v) { return u.departure > v.departure; }

void DFS_rec(Vertex* vertices, int s)
{
	vertices[s].enter = timestamp;
	timestamp++;
	for (int i=0; i<vertices[s].edge_to.size(); i++) {
		int t = vertices[s].edge_to[i];
		if (vertices[t].enter == -1) DFS_rec(vertices, t);
	}
	vertices[s].departure = timestamp;
	timestamp++;
}

void DFS(Vertex* vertices, int m)
{
	for (int i=0; i<m; i++) {
		if (vertices[i].enter == -1) DFS_rec(vertices, i);
	}
}

int main()
{
	int m, n;
	std::cin >> m >> n;
	
	Vertex* vertices = new Vertex[m];
	for (int i=0; i<m; i++) vertices[i].id = i+1;
	for (int i=0; i<n; i++) {
		int s, t;
		std::cin >> s >> t;
		vertices[s-1].edge_to.push_back(t-1);
	}
	
	DFS(vertices, m);
	
	std::sort(vertices, vertices + m, comp_v);
	
	for (int i=0; i<m; i++) {
		std::cout << vertices[i].id << std::endl;
	}
	//for (int i=0; i<m; i++) {
	//	std::cout << vertices[i].id <<  " : enter = " << vertices[i].enter << ", depart = " << vertices[i].departure << std::endl;
	//}
	
	delete[] vertices;
	
	return 0;
}
	

