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: Wrong Answer)

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

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');


function pickGraph(g, edge) {
  var a = edge[0],
      b = edge[1],
      g2 = g.slice();
  (g2[a] = g[a].slice()).splice(g[a].indexOf(b), 1);
  return g2;
}

function countRoom(g) {
  var d = [], i, j, max = 1;
  for (i = 0; i < n; i++) {
    d[i] = 1;
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < g[i].length; j++) {
      d[g[i][j]] = Math.max(d[g[i][j]], d[i] + 1);
    }
//    max = Math.max(max, d[i]);
  }
  return Math.max.apply(null, d);
}
//dp
function getNumRoom(g, nodeList) {
  var d = [], i, j, node, len, len2, max = 1;
  for (i = 0, len = nodeList.length; i < len; i++) {
    d[nodeList[i]] = 1;
  }
  for (i = 0, len = nodeList.length; i < len; i++) {
    node = nodeList[i];
//    d[i]++;
    for (j = 0, len2 = g[node].length; j < len2; j++) {
      d[g[node][j]] = Math.max(d[g[node][j]], d[node] + 1);
    }
    max = Math.max(max, d[node]);
  }
  return max;
}


var temp = input.shift().split(' '),
    n = temp[0],
    m = temp[1],
    edges = [],
    graph,
    graph2,
    i, a, b;
var UF = function () {//union find
  var i,
      par = [],
      nodesListGroup = [];
  for (i = 0; i < n; i++) {
    par[i] = -1;
    nodesListGroup[i] = [];
  }
  function union(x, y) {
    x = find(x);
    y = find(y);
    if (x !== y) {
      if (par[x] < par[y]) {
        par[x] += par[y];
        par[y] = x;
      } else {
        par[y] += par[x];
        par[x] = y;
      }
    }
    return x !== y;
  }

  function find(x) {
    return par[x] < 0 ? x : par[x] = find(par[x]);
  }

  function getNodeListGroup() {
    for (i = 0; i < n; i++) {
      nodesListGroup[find(i)].push(i);
    }
    nodesListGroup = nodesListGroup.filter(function (e, i) {
      return e.length > 0;
    }).map(function (e) {
          return e.sort();
        });
    return nodesListGroup;
  }

  return {
    union: union,
    find: find,
    getNodeListGroup: getNodeListGroup
  };
}();
//make graph and unnion find
var g = [];
for (i = 0; i < n; i++) {
  g[i] = [];
}

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
  UF.union(a, b);// union find
}

var nodeListGroup = UF.getNodeListGroup();
console.log(nodeListGroup);

var numRoomList = nodeListGroup.map(function (nodeList) {//number room group
  return getNumRoom(g, nodeList);
});
//console.log(numRoomList)
var maxNum = Math.max.apply(null, numRoomList),
    index = numRoomList.indexOf(maxNum),
    flag,
    nodeList = nodeListGroup[index];

//console.log(nodeList)
if (~numRoomList.slice(index + 1).indexOf(maxNum)) {
  console.log(-1);
  return;
}

//var edges2 = edges.filter(function (e, i) {
//  return ~nodeList.indexOf(e[0]);
//});

flag = true;
for (i = 0; i < m; i++) {
//  console.log(edges[i][0]);
  if (~nodeList.indexOf(edges[i][0])) {
    graph = pickGraph(g, edges[i]);

    if (getNumRoom(graph, nodeList) < maxNum) {
      console.log(i + 1);
      flag = false;
    }
  }
}
//for (i = 0; i < edges2.length; i++) {
//  graph = pickGraph(g, edges2[i]);
//  console.log(graph)
//  if (getNumRoom(graph, nodeList) < maxNum) {
//    console.log(i + 1);
//    flag = false;
//  }
//}
if (flag) {
  console.log(-1);
}

//var nRooms = countRoom(g);
//flag = true;
//
//
//for (i = 0; i < m; i++) {
//  graph2 = pickGraph(g, edges[i]);
//  if (countRoom(graph2) < nRooms) {
//    console.log(i + 1);
//    flag = false;
//  }
//}