You are given a directed acyclic graph with n vertices and m edges. There are no self-loops or multiple edges between any pair of vertices. Graph can be disconnected.

You should assign labels to all vertices in such a way that:

  * Labels form a valid permutation of length n — an integer sequence such that each integer from 1 to n appears exactly once in it. 
  * If there exists an edge from vertex v to vertex u then labelv should be smaller than labelu. 
  * Permutation should be lexicographically smallest among all suitable. 



Find such sequence of labels to satisfy all the conditions.

Input

The first line contains two integer numbers n, m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105).

Next m lines contain two integer numbers v and u (1 ≤ v, u ≤ n, v ≠ u) — edges of the graph. Edges are directed, graph doesn't contain loops or multiple edges.

Output

Print n numbers — lexicographically smallest correct permutation of labels of vertices.

Examples

Input

3 3
1 2
1 3
3 2


Output

1 3 2 


Input

4 5
3 1
4 1
2 3
3 4
2 4


Output

4 1 2 3 


Input

5 4
3 1
2 1
2 3
4 5


Output

3 1 2 4 5 
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;

/**
 * @since 2017/7/22
 */
public class Main {

    private static Scanner reader = new Scanner(System.in);
    private static PrintStream writer = System.out;

    private void a() {
        int n = reader.nextInt();
        reader.nextLine();
        char[] s = reader.nextLine().toCharArray();

        int last = -1;
        for (int i = 0; i < s.length; i++){
            if (s[i] == '0') {
                writer.print(i-last-1);
                last = i;
            }
        }
        writer.println(s.length - last - 1);
    }

    private void b() {
        char[][] b = new char[10][];
        for (int i = 0; i < 10; i++) {
            b[i] = reader.nextLine().toCharArray();
        }

        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (b[i][j] == '.') {
                    b[i][j] = 'X';
                    if (check(b, i, j)) {
                        writer.println("YES");
                        return;
                    }
                    b[i][j] = '.';
                }
            }
        }

        writer.println("NO");
    }

    private boolean check(char[][] b, int x, int y) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j+5-1 < 10; j++) {
                boolean ok = true;
                for (int k = 0; ok && k < 5; k++) {
                    if (b[i][j+k] != 'X') {
                        ok = false;
                    }
                }
                if (ok) return true;
            }
        }

        for (int j = 0; j < 10; j++) {
            for (int i = 0; i+5-1 < 10; i++) {
                boolean ok = true;
                for (int k = 0; ok && k < 5; k++) {
                    if (b[i+k][j] != 'X') {
                        ok = false;
                    }
                }
                if (ok) return true;
            }
        }

        for (int i = 0; i+5-1 < 10; i++) {
            for (int j = 0; j+5-1 < 10; j++) {
                boolean ok = true;
                for (int k = 0; ok && k < 5; k++) {
                    if (b[i+k][j+k] != 'X') {
                        ok = false;
                    }
                }
                if (ok) return true;
            }
        }

        for (int i = 4; i < 10; i++) {
            for (int j = 0; j+5-1 < 10; j++) {
                boolean ok = true;
                for (int k = 0; ok && k < 5; k++) {
                    if (b[i-k][j+k] != 'X') {
                        ok = false;
                    }
                }
                if (ok) return true;
            }
        }

        return false;
    }

    private void c() {
        int n = reader.nextInt();
        n++;
        int k = reader.nextInt();
        int[] a = new int[n];
        a[0] = 0;
        for (int i = 1; i < n; i++) {
            a[i] = reader.nextInt();
        }
        Arrays.sort(a);

        int ans = 0;
        for (int i = n-1; i > 0; i--) {
            if (2*k >= a[i]) break;

            if (a[i-1]*2 >= a[i]) {
                continue;
            } else {
                int t = a[i];
                while (a[i-1]*2 < t && 2*k < t) {
                    ++ans;
                    t = (t+1) / 2;
                }
            }
        }

        writer.println(ans);
    }

    private int guess(int[] s, int[] t, int q, int u) {
        if (u <= 0) return 0;

        int hb = -1;
        int tu = u;
        while (tu > 0) {
            tu >>= 1;
            ++hb;
        }

        int b = 0;
        for (int i = hb; i >= 0; --i) {
            int x = b + (0x1 << i);

            int c = 0;
            for (int j = 0; j < 26; j++) {
                if (s[j] < t[j]*x) c += t[j]*x - s[j];
            }
            if (c <= q) b = x;
        }
        return b;
    }

    private void d() {
        char[] s = reader.nextLine().toCharArray();
        char[] t = reader.nextLine().toCharArray();

        int[] ct = new int[26];
        int[] cs = new int[26];

        int cq = 0;
        for (char c : s) {
            if (c == '?') ++cq;
            else ++cs[(int)(c-'a')];
        }

        for (char c : t) {
            ++ct[(int)(c - 'a')];
        }

        int k = guess(cs, ct, cq, s.length / t.length);

        char[] r = new char[s.length];
        int top = 0;
        for (int i = 0; i < 26; i++) {
            int d = k*ct[i] - cs[i];
            for (int j = 0; j < d; j++) {
                r[top++] = (char)(i + 'a');
            }
        }

        while (top < cq) r[top++] = 'a';

        for (int i = 0; i < s.length; i++) {
            if (s[i] == '?') {
                if (top > 0) s[i] = r[--top];
                else s[i] = 'a';
            }
        }

        System.out.println(s);
    }

    private void e() {
        int n = ni();
        int m = ni();
        ArrayList<Integer>[] ancesters = (ArrayList<Integer>[])new ArrayList[n+1];

        for (int i = 1; i <= n; i++) {
            ancesters[i] = new ArrayList<Integer>();
        }

        int[] od = new int[n+1];

        for (int i = 0; i < m; i++) {
            int u = ni();
            int v = ni();
            ++ od[u];
            ancesters[v].add(u);
        }

        PriorityQueue<Integer> q = new PriorityQueue<>(n);

        for (int i = 1; i <= n; i++) {
            if (od[i] == 0) {
                q.offer(-i);
            }
        }

        int[] a = new int[n+1];
        int id = n;
        while (!q.isEmpty()) {
            int v = -q.poll();
            a[v] = id--;
            List<Integer> s = ancesters[v];
            for (Integer u : s) {
                --od[u];
                if (od[u] == 0) {
                    q.offer(-u);
                }
            }
        }

        for (int i = 1; i <= n; i++) {
            if (i > 1) writer.print(" ");
            writer.print(a[i]);
        }
        writer.println();
    }

    void run() throws Exception {
        is = oj ? System.in : new ByteArrayInputStream(INPUT.getBytes());
        out = new PrintWriter(System.out);

        long s = System.currentTimeMillis();

        e();

        out.flush();
        tr(System.currentTimeMillis()-s+"ms");
    }

    InputStream is;
    PrintWriter out;
    String INPUT = "3 3\n" +
            "1 2\n" +
            "1 3\n" +
            "3 2";

    public static void main(String[] args) throws Exception { new Main().run(); }

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte()
    {
        if(lenbuf == -1)throw new InputMismatchException();
        if(ptrbuf >= lenbuf){
            ptrbuf = 0;
            try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
            if(lenbuf <= 0)return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
    private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }

    private int ni()
    {
        int num = 0, b;
        boolean minus = false;
        while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
        if(b == '-'){
            minus = true;
            b = readByte();
        }

        while(true){
            if(b >= '0' && b <= '9'){
                num = num * 10 + (b - '0');
            }else{
                return minus ? -num : num;
            }
            b = readByte();
        }
    }

    private boolean oj = System.getProperty("ONLINE_JUDGE") != null;
    private void tr(Object... o) { if(!oj)System.out.println(Arrays.deepToString(o)); }
}
