Problem:
Score : 900 points

Problem Statement

There is a tree with N vertices numbered 1 through N.
The i-th of the N-1 edges connects vertices a_i and b_i.

Initially, each vertex is uncolored.

Takahashi and Aoki is playing a game by painting the vertices. In this game, they alternately perform the following operation, starting from Takahashi:

Select a vertex that is not painted yet.

If it is Takahashi who is performing this operation, paint the vertex white; paint it black if it is Aoki.

Then, after all the vertices are colored, the following procedure takes place:

Repaint every white vertex that is adjacent to a black vertex, in black.

Note that all such white vertices are repainted simultaneously, not one at a time.

If there are still one or more white vertices remaining, Takahashi wins; if all the vertices are now black, Aoki wins.
Determine the winner of the game, assuming that both persons play optimally.

Constraints

2 ≤ N ≤ 10^5

1 ≤ a_i,b_i ≤ N

a_i ≠ b_i

The input graph is a tree.

Input

Input is given from Standard Input in the following format:

N
a_1 b_1
:
a_{N-1} b_{N-1}

Output

Print First if Takahashi wins; print Second if Aoki wins.

Sample Input 1

3
1 2
2 3

Sample Output 1

First

Below is a possible progress of the game:

First, Takahashi paint vertex 2 white.

Then, Aoki paint vertex 1 black.

Lastly, Takahashi paint vertex 3 white.

In this case, the colors of vertices 1, 2 and 3 after the final procedure are black, black and white, resulting in Takahashi's victory.

Sample Input 2

4
1 2
2 3
2 4

Sample Output 2

First

Sample Input 3

6
1 2
2 3
3 4
2 5
5 6

Sample Output 3

Second

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

class Program
{
    public void Proc()
    {
        Reader.IsDebug = false;
        int itemCount = int.Parse(Reader.ReadLine());
        for (int i = 0; i < itemCount; i++)
        {
            list.Add(new TreeNode(i));
        }
        for (int i = 0; i < itemCount - 1; i++)
        {
            int[] inpt = Reader.ReadLine().Split(' ').Select(a => int.Parse(a)-1).OrderBy(a=>a).ToArray();
            int idx0 = inpt[0];
            int idx1 = inpt[1];

            if (list[idx0].Parent != null && list[idx1].Parent != null)
            {
                list[idx1].UpsideDown();
                list[idx0].AddItem(list[idx1]);
            }
            else if (list[idx1].Parent == null)
            {
                list[idx0].AddItem(list[idx1]);
            }
            else
            {
                list[idx1].AddItem(list[idx0]);
            }
        }
        this.list.ForEach(a=>a.SetDepth());
        int ev = this.list.Count(a=>a.Depth%2==0);
        int od = this.list.Count - ev;
        string ans = "First";
        if(Math.Abs(ev-od)<=0) {
            ans = "Second";
        }
        Console.WriteLine(ans);
    }

    List<TreeNode> list = new List<TreeNode>();

    TreeNode root = null;
   

    private class TreeNode
    {
        public int ID;
        public int Depth = -1;
        public TreeNode Parent;
        public List<TreeNode> Items = new List<TreeNode>();
        public void SetDepth() {
            if(this.Depth >= 0) {
                return;
            }
            if(this.Parent == null) {
                this.Depth = 0;
            } else {
                this.Parent.SetDepth();
                this.Depth = this.Parent.Depth + 1;
            }
        }
        public TreeNode(int id)
        {
            this.ID = id;
        }

        public void UpsideDown()
        {
            if (this.Parent.Parent != null)
            {
                this.Parent.Items.Remove(this);
                this.Parent.UpsideDown();
                this.AddItem(this.Parent);
                this.Parent = null;
            }
            
        }
        public void AddItem(TreeNode t)
        {
            this.Items.Add(t);
            t.Parent = this;
        }
    }

    public class Reader
    {
        public static bool IsDebug = true;
        private static String PlainInput = @"


6
1 2
2 3
3 4
2 5
5 6

";
        private static System.IO.StringReader Sr = null;
        public static string ReadLine()
        {
            if (IsDebug)
            {
                if (Sr == null)
                {
                    Sr = new System.IO.StringReader(PlainInput.Trim());
                }
                return Sr.ReadLine();
            }
            else
            {
                return Console.ReadLine();
            }
        }
    }
    static void Main()
    {
        Program prg = new Program();
        prg.Proc();
    }
}