// Original C++ solution (slower):
#include<iostream>

#include<cstdio>

#include<vector> 

using namespace std;



const int maxn = 1e5 + 10;

int fa[maxn];

int co[maxn];

bool visit[maxn];

int flag, ans1, ans2;



vector<vector<int > > G(maxn);

int n;



void init()

{

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

		G[i].clear();

		fa[i] = -1;

		co[i] = 0;				//无色 

		visit[i] = false;

		flag = 0;

	}

	co[1] = -1;					//黑 

	co[n] = 1;					//白 

}



void dfs(int x)

{

	if(x == n){

		flag = 1;				//找到了 

		return ;	

	}	

	

	int tmp;

	for(int i = 0; i < G[x].size() ;i ++){

		if(flag == 1){

			break;

		}

		

		tmp = G[x][i];

		if(visit[tmp] == true){

			continue;

		}

		fa[tmp]	= x;

		visit[tmp] = true;

		dfs(tmp);	

		//visit[tmp] = false;

	}

} 



void dfs1(int x)

{

	int tmp;

	for(int i = 0; i < G[x].size() ;i ++){

		tmp = G[x][i];

		//cout<<"tmp "<<tmp<<endl;

		if(visit[tmp] == false && (co[tmp] == 0 || co[tmp] == -1)){

			//cout<<"tmp"<<tmp<<endl;

			ans1 ++;

			co[tmp] = -1;

			visit[tmp] = true;

			dfs1(tmp);

		}

	}

	

} 



void dfs2(int x)

{

	int tmp;

	for(int i = 0; i <G[x].size() ;i ++){

		tmp = G[x][i];

		if(visit[tmp] == false && (co[tmp] == 0 || co[tmp] == 1)){

			ans2 ++;	

			co[tmp] = 1;

			visit[tmp] = true;

			dfs2(tmp);

		}

	}

	

}



int main()

{

	int a, b;

	int cnt, tmp;

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

		init();

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

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

			G[a].push_back(b);

			G[b].push_back(a); 

		}

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

//			for(int j = 0; j < G[i].size() ;j++){

//				cout<<G[i][j]<<" ";

//			}

//			cout<<endl;

//		}

		

		

		//从1开始dfs找到n的最短路径，树所以只有一条路径 

		visit[1] = true;

		dfs(1);

		

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

//			cout<<fa[i]<<" ";

//		} 

//		cout<<endl;

		cnt = 0;				//1和n中间的结点个数 

		tmp = fa[n];

		while(tmp != 1){

			cnt ++;

			tmp = fa[tmp];

		}

		//cout<<"cnt "<<cnt<<endl;;

		

		//染色 

		tmp = n;

		int tcnt = cnt / 2;

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

			if(i <= tcnt){

				co[fa[tmp]] = 1;

			} else {

				co[fa[tmp]] = -1;

			} 

			tmp = fa[tmp];

		}

		

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

			visit[i] = false;

		}

		visit[1] = true;

		visit[n] = true;

		ans1 = 1;

		ans2 = 1;

		dfs1(1);

		dfs2(n);

		

		//cout<<"ans1 "<<ans1<<endl;

		//cout<<"ans2 "<<ans2<<endl;

				

		if(ans1 > ans2){

			printf("Fennec\n");

		} else {

			printf("Snuke\n");

		}

	}

	return 0;	

} 

// Optimized solution to the same problem (faster):
#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;

}








// Fastest known solution for this problem: