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

#include<algorithm>

#include<string>

#include<functional>

#include<utility>

#include<ctime>

#include<cmath>

#include<vector>

#include<set>

#include<queue>

#include<deque>

#include<map>

#include<cstring>

#include<stack>

#include<cctype>

#include<cstdio>

#include<bitset>

#ifdef LOCAL

	#define enu(i,n) for(int i=0;i<n;i++)

	#define tri(x) x*(x+1)/2;

	#define sqrsum(x) x*(x+1)*(2*x+1)/6;

	#define sqrsum_range(a,b) sqrsum(b)-sqrsum(a-1);

#endif

#define FOR(i,a,b) for(int i=a,_b=b;i<_b;i++)

#define REP(i,a,b) FOR(i,a,b+1)

#define ll_max 9223372036854775807LL

#define ll_min -9223372036854775808LL

#define int_max 2147483647

#define int_min -2147483648

#define PI 3.141592653589793238462653383

#define eps 0.00000001

#define elif else if

using namespace std;

void fast()

{

	cin.tie(NULL);

	cout.tie(NULL);

	ios_base::sync_with_stdio(false);

	return ;

}

bool isprime(int x)

{

	if(x<2)

		return false;

	for(int i=2;i<=sqrt(x);i++)

		if(x%i==0)

			return false;

	return true;

}

int GCD(int a,int b)

{

	return (b?GCD(b,a%b):a);

}

struct Tm

{

	int h,m,s;

	bool add()

	{

		s++;

		if(s==60)

			m++,

			s=0;

		if(m==60)

			h++,

			m=0;

		return (h<100);

	}

	void print()

	{

		printf("%02d:%02d:%02d",h,m,s);

		return ;

	}

	void println()

	{

		print();

		puts("");

	}

};

vector<int> G[100100];

int dist[100100][2];

void dfs(int now,int pre,int x)

{

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

		if(G[now][i]!=pre)

		{

			dist[G[now][i]][x]=dist[now][x]+1;

			dfs(G[now][i],now,x);

		}

	return ;

}

int main()

{

	int N;

	cin>>N;

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

	{

		int a,b;

		cin>>a>>b;

		G[a].push_back(b);

		G[b].push_back(a);

	}

	dfs(1,0,0);

	dfs(N,0,1);

	int cnt1=0,cnt2=0;

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

		if(dist[i][0]<=dist[i][1])

			cnt1++;

		else	cnt2++;

	if(cnt2>=cnt1)

		puts("Snuke");

	else	puts("Fennec");

	return 0;

}

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

#include <bitset>

#include <cmath>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <deque>

#include <list>

#include <map>

#include <iomanip>

#include <iostream>

#include <queue>

#include <set>

#include <stack>

#include <string>

#include <utility>

#include <vector>

#define fi first

#define se second

#define pb push_back

//#define mp make_pair

#define rep(i,n) for(register int (i)=0;(i)<(n);(i)++)

using namespace std;

typedef long long LL;

typedef pair<int,int> pii;

const int INF=0x3f3f3f3f;

const int dx[]={0,1,-1,0},dy[]={1,0,0,-1};

//const int MOD=998244353;

const int N=2e5+10;



inline int read(){

	int ww=1,xx=0;char ch=getchar();

	while(!isdigit(ch)){if(ch=='-') ww=-ww;ch=getchar();}

	while(isdigit(ch)){xx=(xx<<1)+(xx<<3)+(ch^48);ch=getchar();}

	return ww*xx;

}



int n;

int num[N];

int q[N];

int head[N];

int cnt,tmp;

bool f;

int ans;



struct Edge{

	int to,nxt;

}ed[N];



void add_edge(int a,int b){

	ed[++cnt].to=b;

	ed[cnt].nxt=head[a];

	head[a]=cnt;

}



void dfs(int u,int p){

//	printf("%d ",u);

	if(!f) q[tmp++]=u;

	if(u==n) f=true;

	for(int i=head[u];i!=-1;i=ed[i].nxt){

		int v=ed[i].to;

		if(v!=p){

			dfs(v,u);

			num[u]+=num[v]+1;

		}

	}

	if(!f) --tmp;

	return ;

}



signed main(){

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

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

	memset(head,-1,sizeof(head));

	n=read();

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

		int fr,to;

		fr=read();

		to=read();

		add_edge(fr,to);

		add_edge(to,fr);

	}

	tmp=1;

	dfs(1,-1);

//	for(int i=1;i<tmp;i++) printf("%d ",q[i]);

	for(int i=1;i<=tmp/2;i++) ans+=num[q[i]]-num[q[i+1]];

	if(ans>n-ans) puts("Fennec");

	else puts("Snuke");

	return 0;

}

/*

7

3 6

1 2

3 1

7 4

5 7

1 4



4

1 4

4 2

2 3

*/