Problem:
社員旅行

Problem Statement

あなたの会社にはn人の社員が存在する．m個の社員(a_i,b_i)の組について，a_iはb_iの上司である．

社員xが社員yの実質的な上司であるとは，次のうち少なくとも一方が成り立つことをいう．

xがyの上司である．

yの実質的な上司である社員zが存在して，xはzの上司である．

あなたの会社で，自分自身が自分の実質的な上司であるような社員は存在しない．

あなたの会社では社員が全員参加する社員旅行が計画されている．全社員の要求により，旅館での部屋割りは「よい部屋割り」でなければならない．

ある部屋割りが「よい部屋割り」であるとは以下の両方が満たされることをいう．

各社員はどこかの部屋に割り振られる．

社員xと社員yが同じ部屋に割り振られているとき，xはyの実質的な上司でない．

幹事の社員は非常に優秀なので，「よい部屋割り」でかつ必要な部屋の数が最小になるように部屋割りを行った．しかし残念なことに予算が不足している．どうしても必要な部屋の数を減らさなければならないらしい．

そこで，人事部で働くあなたは上司-部下の関係を一つだけ解消することによって，「よい部屋割り」を得るために必要な部屋の数を減らすことにした．

さて，どの関係を解消すればよいのだろう？

Input

入力は以下の形式に従う．与えられる数は全て整数である．

n m
a_1 b_1
...
a_m b_m

Constraints

2≦n≦10^5

1≦m≦2 \times 10^5

1≦a_i<b_i≦n

i \neq jならば(a_i, b_i) \neq (a_j, b_j)

Output

次を満たすようなiを昇順に1行ずつ出力せよ．

「a_iがb_iの上司である」という関係を解消したとき，「よい部屋割り」を得るために必要な部屋の数を減らすことができる．

そのようなiが存在しない場合は-1を1行に出力せよ．

Sample Input 1

5 4
1 2
2 3
3 4
3 5

Output for the Sample Input 1

1
2

Solution in JAVA (judge verdict: Wrong Answer)

import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
import static java.util.Collections.*;

public class Main{
	Scanner sc=new Scanner(System.in);

	int INF=1<<28;
	double EPS=1e-12;

	int n, m;
	int[] a, b;

	void run(){
		n=sc.nextInt();
		m=sc.nextInt();
		a=new int[m];
		b=new int[m];
		for(int i=0; i<m; i++){
			a[i]=sc.nextInt()-1;
			b[i]=sc.nextInt()-1;
		}
		solve();
	}

	@SuppressWarnings("unchecked")
	void solve(){
		ArrayList<Integer>[] es=new ArrayList[n];
		ArrayList<Integer>[] rs=new ArrayList[n];
		for(int i=0; i<n; i++){
			es[i]=new ArrayList<Integer>();
			rs[i]=new ArrayList<Integer>();
		}
		for(int i=0; i<m; i++){
			es[a[i]].add(b[i]);
			rs[b[i]].add(a[i]);
		}
		int[] d1=new int[n];
		int[] d2=new int[n];
		for(int i=0; i<n; i++){
			for(int j : es[i]){
				d1[j]=max(d1[j], d1[i]+1);
			}
		}
		for(int i=n-1; i>=0; i--){
			for(int j : rs[i]){
				d2[j]=max(d2[j], d2[i]+1);
			}
		}
		// debug("d1", d1);
		// debug("d2", d2);
		int maxChain=0;
		for(int i=0; i<n; i++){
			maxChain=max(maxChain, d1[i]+d2[i]);
		}
		// debug("maxChain", maxChain);
		int[] ind=new int[n];
		for(int i=0; i<m; i++){
			if(d1[a[i]]+1+d2[b[i]]==maxChain){
				// 候補
				if(ind[d1[a[i]]]==0){
					ind[d1[a[i]]]=a[i]+1;
				}else{
					ind[d1[a[i]]]=-1;
				}
			}
		}
		// debug(ind);
		sort(ind);
		int count=0;
		for(int i : ind){
			if(i>0){
				println(i+"");
				count++;
			}
		}
		if(count==0){
			println("-1");
		}
	}

	void debug(Object... os){
		System.err.println(Arrays.deepToString(os));
	}

	void print(String s){
		System.out.print(s);
	}

	void println(String s){
		System.out.println(s);
	}

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