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

#include <algorithm>

#include <cstring>

#include <cstdio>

using namespace std;

const int MAXN=1e5+10;

int num1[MAXN],num2[MAXN];

int T,n;

int head[MAXN],net[2*MAXN],u[2*MAXN],v[2*MAXN],tot;

int read()

{

	int f=0,w=1; char ch=getchar();

	while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }

	while(ch>='0'&&ch<='9') { f=(f<<3)+(f<<1)+ch-'0'; ch=getchar(); }

	return f*w;

}

void add(int l,int r)

{

	u[++tot]=l; v[tot]=r; net[tot]=head[l]; head[l]=tot;

}

int vt[MAXN];

void dfs(int now,int step,int flag)

{

	vt[now]=1; 

	if(flag==1) num1[now]=step;

	if(flag==2) num2[now]=step;

	for(int i=head[now];i;i=net[i])

		if(vt[v[i]]==0)

			dfs(v[i],step+1,flag);

}

int main()

{

	//freopen("T3.in","r",stdin);

	//freopen("T3.out","w",stdout);

	T=1;

	while(T--)

	{

		n=read(); tot=0;

		memset(head,0,sizeof(head));

		memset(net,0,sizeof(net));

		memset(u,0,sizeof(u));

		memset(v,0,sizeof(v));

		memset(num1,0,sizeof(num1));

		memset(num2,0,sizeof(num2));

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

		{

			int l=read(),r=read();

			add(l,r);

			add(r,l);

		}

		memset(vt,0,sizeof(vt));

		dfs(1,0,1);

		memset(vt,0,sizeof(vt));

		dfs(n,0,2);

		int p1=0,p2=0;

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

		{

			if(num1[i]<num2[i])

				p1++;

			if(num2[i]<num1[i])

				p2++;

			if(num1[i]==num2[i])

				p1++;

		}

		if(p1>p2) printf("Fennec\n");

		else printf("Snuke\n");

	}

}

// Faster C++ solution for the same problem (measured speedup: 1.4353331189659309x):
#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];

bool vis[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);

		}

	}

}



void go(int p,int left,int col,int dist[]){

	if(color[p]) return;

	if(!left) return;

	color[p]=col;

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

		int u=mp[p][i];

		if(dist[u]>dist[p]) continue;

		go(u,left-1,col,dist);

	}

}



void go2(int p){

	if(color[p]==2) return;

	if(vis[p]) return;

	vis[p]=true;

	color[p]=1;

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

		int u=mp[p][i];

		go2(u);

	}

}



int main(){

	int n;

	cin>>n;

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

		cin>>a>>b;

		a--;

		b--;

		mp[a].push_back(b);

		mp[b].push_back(a);

	}

	bfs(n-1,dist);

	bfs(0,dist2);

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

//		cout<<dist[i]<<' ';

//	}

//	cout<<endl;

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

//		cout<<dist2[i]<<' ';

//	}

//	cout<<endl;

	int s=(dist[0]+1)/2;

	int f=(dist[0]+1)-s;

//	cout<<f<<' '<<s<<endl;

	go(0,f,1,dist);

	go(n-1,s,2,dist2);

//	int ttt=0;

//	for(int i=0;i<n;i++) if(color[i]==2) ttt++;

//	cout<<ttt<<endl;

	go2(0);

	f=0;

	for(int i=0;i<n;i++) if(color[i]==1) f++;

	s=n-f;

//	cout<<f<<' '<<s<<endl;

	if(s>=f){

		cout<<"Snuke\n";

	}

	else{

		cout<<"Fennec\n";

	}

	return 0;

}