#include <iostream>
#include <memory>
#include <vector>
class Suspect {
public:
	Suspect(const int &m) :prev(0), sus(m), id{ 0 }, order{ 0 } {
		for (auto i = 1; i <= m; ++i) {
			sus.at(i - 1) = std::make_shared<Suspect>(Suspect(i, true));
		}
	}
	void add_evidence(const int &a, const int &b) {
		sus.at(a - 1)->prev.push_back(sus.at(b - 1));
	}
	std::vector<int> search() {
		std::vector<int> res(sus.size());
		std::vector<int> ord(sus.size());
		for (auto i = 0; i < sus.size(); ++i) {
			ord.at(i) = sus.at(i)->cul_order();
			res.at(i) = i + 1;
		}
		for (auto i = 0; i < sus.size(); ++i) {
			auto min = i;
			for (auto j = i + 1; j < sus.size(); ++j) {
				if (ord.at(j) > ord.at(min)) {
					min = j;
				}
			} 
			auto temp = res.at(i);
			res.at(i) = res.at(min);
			res.at(min) = temp;
			ord.at(min) = ord.at(i);
		}
		return res;
	}
private:
	const int id;
	int order;
	std::vector<std::shared_ptr<Suspect>> prev;
	std::vector<std::shared_ptr<Suspect>> sus;
	Suspect(const int &i, const bool &b) : prev(0), sus(0), id{ i }, order{ 0 } {};
	int cul_order() const {
		if (id == 2) {
			return 0;
		}
		else {
			int res = 0;
			for (auto &p : prev) {
				if (p->cul_order() > res) {
					res = p->cul_order();
				}
			}
			return res + 1;
		}
	}
};
int main() {
	int m, n;
	std::cin >> m >> n;
	Suspect neko(m);
	for (auto i = 0; i < n; ++i) {
		int a, b;
		std::cin >> a >> b;
		neko.add_evidence(a, b);
	}
	for (const auto &i : neko.search()) {
		std::cout << i << '\n';
	}
	return 0;
}