// Slower C++ solution:
#include <iostream>

#include <string>

#include <cstdio>

#include <vector>

#include <queue>

#include <list>

#include <cstdlib>

#include <algorithm>

#include <set>

#include <map>

#include <deque>

#include <cstring>

#include <cmath>

//#include<bits/stdc++.h>

using namespace std;



const int INF=0x3f3f3f3f;

const int SIZE=100005;



vector<int> mp[SIZE];

int color[SIZE],dist[SIZE],dist2[SIZE];



void bfs(int s,int dist[]){

	queue<int> que;

	que.push(s);

	while(!que.empty()){

		int u=que.front();

		que.pop();

		for(int i=0;i<mp[u].size();i++){

			int t=mp[u][i];

			if(dist[t] || t==s) continue;

			dist[t]=dist[u]+1;

			que.push(t);

		}

	}

}



int main(){

	int n;

	scanf("%d",&n);

	for(int i=0,a,b;i<n-1;i++){

		scanf("%d%d",&a,&b);

		a--;

		b--;

		mp[a].push_back(b);

		mp[b].push_back(a);

	}

	bfs(0,dist);

	bfs(n-1,dist2);

	int s=0,f=0;

	for(int i=0;i<n;i++){

		if(dist[i]<=dist2[i]) f++; else s++;

	}

	if(s>=f){

		puts("Snuke");

	}

	else{

		puts("Fennec");

	}

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.9632950248244483x):
#include <iostream>

#include <cstring>

#include <queue>

using namespace std;

const int maxn = 1e5 + 10;

const int maxm = 1e5 + 10;

struct edge{

	int to;

	int next;

}Edge[2 * maxm];

int head[maxn], pos, n, color[maxn];

void init(){

	for(int i = 0; i < maxn; i++) head[i] = -1;

	for(int i = 0; i < maxn; i++) color[i] = -1; // -1 is uncolored 1 is whrite, 0 is black

	pos = 0;

}

void addEdge(int u, int v){

	Edge[pos].to = v;

	Edge[pos].next = head[u];

	head[u] = pos;

	pos++;

}

void BFS(){

	queue <int> q;

	color[1] = 0;

	color[n] = 1;

	q.push(1);

	q.push(n);

	while(!q.empty()){

		int h = q.front();

		q.pop();

		for(int i = head[h]; i != -1; i = Edge[i].next){

			if(color[Edge[i].to] == -1){

				color[Edge[i].to] = color[h];

				q.push(Edge[i].to);

			}

		}

	}

}

// void BFS(){

// 	queue <int> qw;

// 	queue <int> qb;

// 	qw.push(n);

// 	color[n] = 1;

// 	qb.push(1);

// 	color[1] = 0;

// 	while(!qw.empty() || !qb.empty()){

// 		if(!qb.empty()){

// 			int h = qb.front();

// 			//cout << "B" << h << endl;

// 			qb.pop();

// 			for(int i = head[h]; i != -1; i = Edge[i].next){

// 				if(color[Edge[i].to] == -1){

// 					//cout << Edge[i].to << " ";

// 					color[Edge[i].to] = 0;

// 					qb.push(Edge[i].to);

// 				}

// 			}

// 			//cout << endl;

// 		}

// 		if(!qw.empty()){

// 			int h = qw.front();

// 			//cout << "W" << h << endl;

// 			qw.pop();

// 			for(int i = head[h]; i != -1; i = Edge[i].next){

// 				if(color[Edge[i].to] == -1){

// 					//cout << Edge[i].to << " ";

// 					color[Edge[i].to] = 1;

// 					qw.push(Edge[i].to);

// 				}

// 			}

// 			//cout << endl;

// 		}

// 	}



// }

int main(){

	//freopen("input.txt", "r", stdin);

	while(scanf("%d", &n) != EOF){

		init();

		for(int i = 1; i <= n - 1; i++){

			int u, v;

			scanf("%d%d", &u, &v);

			addEdge(u, v);

			addEdge(v, u);

		}

		//cout << n << endl;

		BFS();

		int white = 0, black = 0;

		for(int i = 1; i <= n; i++){

			//cout << i << ":"<< color[i] << endl;

			if(color[i] == 1) white++;

			else black++;

		}

		//cout << white <<" "<< black << endl;

		if(white < black) printf("Fennec\n");

		else printf("Snuke\n");

	}

	return 0;

}