Problem:
Score : 400 points

Problem Statement

Fennec and Snuke are playing a board game.

On the board, there are N cells numbered 1 through N, and N-1 roads, each connecting two cells. Cell a_i is adjacent to Cell b_i through the i-th road. Every cell can be reached from every other cell by repeatedly traveling to an adjacent cell. In terms of graph theory, the graph formed by the cells and the roads is a tree.

Initially, Cell 1 is painted black, and Cell N is painted white. The other cells are not yet colored.
Fennec (who goes first) and Snuke (who goes second) alternately paint an uncolored cell.
More specifically, each player performs the following action in her/his turn:

Fennec: selects an uncolored cell that is adjacent to a black cell, and paints it black.

Snuke: selects an uncolored cell that is adjacent to a white cell, and paints it white.

A player loses when she/he cannot paint a cell. Determine the winner of the game when Fennec and Snuke play optimally.

Constraints

2 \leq N \leq 10^5

1 \leq a_i, b_i \leq N

The given 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

If Fennec wins, print Fennec; if Snuke wins, print Snuke.

Sample Input 1

7
3 6
1 2
3 1
7 4
5 7
1 4

Sample Output 1

Fennec

For example, if Fennec first paints Cell 2 black, she will win regardless of Snuke's moves.

Sample Input 2

4
1 4
4 2
2 3

Sample Output 2

Snuke

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

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

namespace AtCoder
{
	public class Program
	{
		/* 問題文
フェネックとすぬけくんがボードゲームで遊んでいます。

このボードゲームには 1 番から N 番までの番号がついた N 個のマスと、マスどうしをつなぐ N−1 本の道が存在しています。
ai 番のマスと bi 番のマスは i 番目の道を介して隣り合っています。
どの 2 つのマスも隣接するマスをいくつか辿って必ず辿り着くことが可能です。
すなわち、グラフ理論の言葉を用いると、マスと道から構成されるグラフは木です。

はじめに 1 番のマスは黒く、N 番のマスは白く塗られています。その他のマスはまだ色が塗られていません。 
先手のフェネックと後手のすぬけくんは残りのマスに交互に色を塗ります。 自分の手番において、2 人はそれぞれ以下のような行動を行います。

フェネック：黒く 塗られたマスに隣接したマスであって、色が塗られていないマスを 1 つ選んで 黒く 塗る。
すぬけくん：白く 塗られたマスに隣接したマスであって、色が塗られていないマスを 1 つ選んで 白く 塗る。
手番のプレイヤーがマスに色を塗ることができなかったとき、敗者となります。フェネックとすぬけくんが最適に行動したとき勝者はどちらか判定してください。

制約
2≤N≤105
1≤ai,bi≤N
与えられるグラフは木
		 */

		static string フェネックの名前 = "Fennec";
		static string すぬけくんの名前 = "Snuke";
		const int 透明 = 0;
		const int 黒 = 1;
		const int 白 = 2;

		public static void Main(string[] args)
		{
			var str = Console.ReadLine().Split(' ');
			var マスの数 = int.Parse(str[0]); // 2 ~ 10^5
			var 道の数 = マスの数 - 1;
			var マスの情報 = new List<int>[マスの数 + 1];

			for (var マスの番号 = 0; マスの番号 < マスの数 + 1; マスの番号++)
			{
				マスの情報[マスの番号] = new List<int>();
			}

			for (var 道の番号 = 0; 道の番号 < 道の数; 道の番号++)
			{
				var 一つの道の情報 = Console.ReadLine().Split(' ').Select(s => int.Parse(s)).ToArray();
				マスの情報[一つの道の情報[0]].Add(一つの道の情報[1]);
				マスの情報[一つの道の情報[1]].Add(一つの道の情報[0]);
			}

			// ループしない木なので、相手に向かって塗って、その後は自分の面積の大きい方が勝ちみたいな感じにしたい
			// 同点なら後攻のすぬけくんの勝ち
			// よくわかんないのでモンテカルロっぽい何かで挑む
			var シミュレート回数 = 500;
			var シミュレート結果 = 0; // フェネックが勝ったら -1 すぬけくんが勝ったら +1
			var マスの色の情報 = new int[マスの数 + 1];
			var フェネックの最初のマス = 1;
			var すぬけくんの最初のマス = マスの数;
			var 乱数 = new System.Random();
			var 生き延びた最大ターン = -1;
			for (var 回数 = 0; 回数 < シミュレート回数; 回数++)
			{
				var フェネックの進める箇所 = new List<int>();
				var すぬけくんの進める箇所 = new List<int>();

				for (var マスの番号 = 0; マスの番号 < マスの数 + 1; マスの番号++)
				{
					マスの色の情報[マスの番号] = 透明;
				}
				マスの色の情報[フェネックの最初のマス] = 黒;
				マスの色の情報[すぬけくんの最初のマス] = 白;

				フェネックの進める箇所.AddRange(マスの情報[フェネックの最初のマス]);
				すぬけくんの進める箇所.AddRange(マスの情報[すぬけくんの最初のマス]);

				var 最大ターン数 = 1 + マスの数 / 2;
				for (var ターン = 0; ターン < 最大ターン数; ターン++)
				{
					// 先行はフェネック

					bool フェネックが移動した = false;
					if (フェネックの進める箇所.Count > 1)
					{
						var 次の移動候補で一番優先したいところ = 乱数.Next(0, フェネックの進める箇所.Count);
						var 保存領域 = フェネックの進める箇所[0];
						フェネックの進める箇所[0] = フェネックの進める箇所[次の移動候補で一番優先したいところ];
						フェネックの進める箇所[次の移動候補で一番優先したいところ] = 保存領域;
					}
					for (var 移動候補の番号 = 0; 移動候補の番号 < フェネックの進める箇所.Count; 移動候補の番号++)
					{
						var 移動候補 = フェネックの進める箇所[移動候補の番号];
						if (マスの色の情報[移動候補] == 透明)
						{
							マスの色の情報[移動候補] = 黒;
							フェネックの進める箇所.AddRange(マスの情報[移動候補]);
							フェネックが移動した = true;
							break;
						}
						フェネックの進める箇所.RemoveAt(移動候補の番号);
						移動候補の番号--;
					}

					if (!フェネックが移動した)
					{
						if (生き延びた最大ターン < ターン)
						{
							シミュレート結果 = 1;
							生き延びた最大ターン = ターン;
						}
						break;
					}

					bool すぬけくんが移動した = false;
					if (すぬけくんの進める箇所.Count > 1)
					{
						var 次の移動候補で一番優先したいところ = 乱数.Next(0, すぬけくんの進める箇所.Count);
						var 保存領域 = すぬけくんの進める箇所[0];
						すぬけくんの進める箇所[0] = すぬけくんの進める箇所[次の移動候補で一番優先したいところ];
						すぬけくんの進める箇所[次の移動候補で一番優先したいところ] = 保存領域;
					}
					for (var 移動候補の番号 = 0; 移動候補の番号 < すぬけくんの進める箇所.Count; 移動候補の番号++)
					{
						var 移動候補 = すぬけくんの進める箇所[移動候補の番号];
						if (マスの色の情報[移動候補] == 透明)
						{
							マスの色の情報[移動候補] = 白;
							すぬけくんの進める箇所.AddRange(マスの情報[移動候補]);
							すぬけくんが移動した = true;
							break;
						}
						すぬけくんの進める箇所.RemoveAt(移動候補の番号);
						移動候補の番号--;
					}

					if (!すぬけくんが移動した)
					{
						if (生き延びた最大ターン < ターン)
						{
							シミュレート結果 = -1;
							生き延びた最大ターン = ターン;
						}
						break;
					}
				}
			}

			var 勝者の名前 = シミュレート結果 < 0 ? フェネックの名前 : すぬけくんの名前;

			Console.WriteLine(勝者の名前);
		}
	}
}