Problem:
Score : 200 points

Problem Statement

Takahashi wants to gain muscle, and decides to work out at AtCoder Gym.

The exercise machine at the gym has N buttons, and exactly one of the buttons is lighten up.
These buttons are numbered 1 through N.
When Button i is lighten up and you press it, the light is turned off, and then Button a_i will be lighten up. It is possible that i=a_i.
When Button i is not lighten up, nothing will happen by pressing it.

Initially, Button 1 is lighten up. Takahashi wants to quit pressing buttons when Button 2 is lighten up.

Determine whether this is possible. If the answer is positive, find the minimum number of times he needs to press buttons.

Constraints

2 ≤ N ≤ 10^5

1 ≤ a_i ≤ N

Input

Input is given from Standard Input in the following format:

N
a_1
a_2
:
a_N

Output

Print -1 if it is impossible to lighten up Button 2.
Otherwise, print the minimum number of times we need to press buttons in order to lighten up Button 2.

Sample Input 1

3
3
1
2

Sample Output 1

2

Press Button 1, then Button 3.

Sample Input 2

4
3
4
1
2

Sample Output 2

-1

Pressing Button 1 lightens up Button 3, and vice versa, so Button 2 will never be lighten up.

Sample Input 3

5
3
3
4
2
4

Sample Output 3

3

Solution in C# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
using static System.Convert;

namespace AtCoder
{
    class Program
    {
        static void Main(string[] args)
        {
            //[summary]B - Trained?

            ////処理時間の計測
            //var sw = new System.Diagnostics.Stopwatch();
            //sw.Start();
            
            var lines = ReadLines<int>(1).ToList();
            int n = lines[0][0];

            var buttons = ReadLines(n).ToList();

            int count = CountLightButton2(buttons);

            ////処理時間の出力
            //sw.Stop();
            //TimeSpan ts = sw.Elapsed;
            //string s = ts.ToString(@"hh\:mm\:ss");
            //Console.WriteLine(s);

            Console.WriteLine(count);
        }

        static int CountLightButton2(List<int> buttons)
        {
            int index = 0;
            int count = 0;

            //押されたことのあるボタンを記録しておく
            var indexes = new List<int>() { 0 };

            while (true)
            {
                var button = buttons[index];
                count++;

                if (button == 2)
                {
                    return count;
                }
                else
                {
                    index = button - 1;

                    if (!indexes.Contains(index))
                    {
                        indexes.Add(index);
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return -1;
        }
        //static int CountLightButton2(List<List<int>> buttons)
        //{
        //    int index = 0;
        //    int count = 0;

        //    //押されたことのあるボタンを記録しておく
        //    var indexes = new List<int>() { 0 };

        //    while (true)
        //    {
        //        var button = buttons[index][0];
        //        count++;

        //        if (button == 2)
        //        {
        //            return count;
        //        }
        //        else
        //        {
        //            index = button - 1;

        //            if (!indexes.Contains(index))
        //            {
        //                indexes.Add(index);
        //            }
        //            else
        //            {
        //                break;
        //            }
        //        }
        //    }

        //    return -1;
        //}

        private static IEnumerable<int> ReadLines(int count)
        {
            for(int i = 0; i < count; i++)
            {
                string line = Console.ReadLine().TrimEnd();
                yield return int.Parse(line);
            }
        }

        static IEnumerable<List<T>> ReadLines<T>(int count = 0, char separator = ' ')
        {
            //[summary]コンソールの値を読み込んで、List<T>のコレクションを返却

            //読み込む行数が未指定のときは、1行目の値を"count"とみなす
            if (count == 0)
            {
                string line = Console.ReadLine().TrimEnd();
                count = int.Parse(line);
            }

            for (int i = 0; i < count; i++)
            {
                //コンソールを1行読み込み
                string line = Console.ReadLine().TrimEnd();

                //char型のときは1文字ずつに分割
                if (typeof(T) == typeof(char))
                {
                    var list = line.ToCharArray().ToList();
                    yield return (List<T>)(object)list;
                }
                else
                {
                    //読み込んだ値を"separator"で区切る
                    var list = line.Split(separator).ToList();

                    //int型のときは数値に変換
                    if (typeof(T) == typeof(int))
                    {
                        var numbers = list.ConvertAll(int.Parse);
                        yield return (List<T>)(object)numbers;
                    }
                    else if (typeof(T) == typeof(long))
                    {
                        var numbers = list.ConvertAll(long.Parse);
                        yield return (List<T>)(object)numbers;
                    }
                    else
                    {
                        yield return (List<T>)(object)list;
                    }
                }
            }
        }
    }
}