#include <cstdio>
#include <queue>
#include <cstring>
int n, m, ord = 0;
int G[5050][5050], dist[5050];
std::queue<int> Q, Q2;
void prt_val(void)
{
    bool isBrs = false;
    if( Q.size() > 1 ) printf("{ "), isBrs = true;
    while(!Q.empty()) printf("%d ", Q.front()), Q.pop();
    if( isBrs ) printf("} ");

}
int main()
{
    for(int p = 13 ; p <= 15 ; p++ )
    {
        memset(dist, 0, sizeof(dist)); ord = 0;
        memset(G, 0, sizeof(G));
        char in[110],out[110];
        sprintf(in,".%d.in",p); sprintf(out,".%d.out",p);
        freopen(in,"r",stdin); freopen(out,"w",stdout);
    scanf("%d%d", &n, &m);
    for(int i = 0 ; i < m ; i++ )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        G[a][b] = true;
    }
    for(int i = 1 ; i <= n ; i++ )
        for(int j = 1 ; j <= n ; j++ )
            G[n+1][i] += G[j][i];
    for(int i = 1 ; i <= n ; i++ )
        if( G[n+1][i] == 0 ) Q.push(i), dist[i] = 0;
    while(!Q.empty())
    {
        int x = Q.front(); Q.pop();
        Q2.push(x);
        for(int i = 1 ; i <= n ; i++ )
            if( G[x][i] == 1 )
            {
                G[x][i] = 0, G[n+1][i]--;
                if( G[n+1][i] == 0 ) Q.push(i), dist[i] = dist[x]+1;
            }
    }
    if( Q2.size() < n ) printf("-1");
    else
    {
        while(!Q2.empty() )
        {
            Q.push(Q2.front()), Q2.pop();
            if( ord != dist[Q2.front()]) ord = dist[Q2.front()], prt_val();
        }
        prt_val();
    }
    }
}
/*
7 9
1 2
1 3
1 4
2 7
3 5
2 6
4 6
5 6
6 7

9 11
1 2
1 3
1 4
2 5
3 5
4 6
5 7
5 8
6 8
7 9
8 9

11 13
10 2
1 2
1 3
1 4
2 5
3 5
4 6
5 7
5 8
6 8
7 9
8 9
7 11

11 14
10 2
1 2
1 3
1 4
2 5
3 5
4 6
5 7
5 8
6 8
7 9
8 9
7 11
11 5
*/
