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 JavaScript (judge verdict: Accepted)

/**
 * Created by hiroqn on 13/10/07.
 */

var fs = require('fs'),
    length = fs.fstatSync(process.stdin.fd).size,
    buffer = new Buffer(length),
    bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
    input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();
function main() {
  var temp = input.shift().split(' '),
      n = temp[0],
      m = temp[1],
      edges = [],
      g = [],
      gInv = [],
      dp = [],
      i, j,
      len,
      a, b;
  for (i = 0; i < n; i++) {
    g[i] = [];
    gInv[i] = [];
    dp[i] = 0;
  }

  for (i = 0; i < m; i++) {
    temp = input[i].split(' ');
    a = temp[0] - 1;
    b = temp[1] - 1;
    edges[i] = [a, b];//edges
    g[a].push(b); // make graph
    gInv[b].push(a);
  }
  for (i = 0; i < n; i++) {
    for (j = 0, len = g[i].length; j < len; j++) {
      if (dp[g[i][j]] < dp[i] + 1) {
        dp[g[i][j]] = dp[i] + 1
      }
    }
  }
  var max = Math.max.apply(null, dp),
      nodeList = [],
      level = [],
      hash ={},
      flag = true;
  for (i = 0; i < n; i++) {
    nodeList[i] = max === dp[i];
    level[i] = 0;
  }
  for (i = n - 1; i >= 0; i--) {
    if (!nodeList[i]) {
      continue
    }
    for (j = 0, len = gInv[i].length; j < len; j++) {
      if (dp[gInv[i][j]] + 1 === dp[i]) {
        nodeList[gInv[i][j]] = true;
        level[dp[gInv[i][j]]]++;
        hash[[gInv[i][j],i]] = true;
//        console.log([gInv[i][j],i]);
      }
    }

  }

  for (i = 0; i < m; i++) {
//    console.log(dp[edges[i][0]],level[dp[edges[i][0]]] ,edges[i],hash[[gInv[i][j],i]]);
    if ( hash[edges[i]] && level[dp[edges[i][0]]] === 1) {//nodeList[edges[i][0]] && nodeList[edges[i][1]]

      console.log(i + 1);
      flag = false;
    }
  }
  if (flag) {
    console.log(-1);
  }
}