#include<bits/stdc++.h>
using namespace std;
void addedge(vector<int>adj[],int u,int v)
{
adj[u].push_back(v);
}
void toposort(vector<int>adj[],int n)
{
queue<int>q;
vector<int>indegree(n,0);
for(int i=0;i<n;i++)
{
for(auto it: adj[i])
{
indegree[it]++;
}
}
for(int i=0;i<n;i++)
{
if(indegree[i]==0)
{
q.push(i);
}
}vector<int>topo;
while(!q.empty())
{
int node=q.front();
q.pop();
topo.push_back(node);
for(auto it:adj[node])
{
indegree[it]--;
if(indegree[it]==0)
{
q.push(it);
}
}
}
int si=topo.size();
for(int i=0;i<si;i++)
{
cout<<topo[i]<<" ";
}
}
int main()
{
int vertex,edges;
cout<<"Enter the number of vertex and edges:"<<endl;
cin>>vertex>>edges;
vector<int>adj[vertex];
int a,b;
cout<<"Enter the links:"<<endl;
for(int i=0;i<vertex;i++)
{
cin>>a>>b;
addedge(adj,a,b);
}
toposort(adj,vertex);
return 0;
}