#include <bits/stdc++.h> 

using namespace std;

#define fcout(d) cout << fixed << setprecision(d)
#define rep(i,n) for(int (i)=0; (i)<(n); ++(i))
#define rep1(i,n) for(int (i)=1; (i)<=(n); ++(i))
#define repU(i,bottom,ceiling) for(int (i) = (bottom); (i) <= (ceiling); ++(i))
#define repD(i,ceiling,bottom) for(int (i) = (ceiling); (i) >= (bottom); --(i))
#define pub push_back
#define pob pop_back
#define prf printf
#define scf scanf
#define mkp make_pair
#define fir first
#define sec second
#define clr(a) memset((a),0,sizeof(a))

typedef long long ll;
typedef double db;

const vector<pair<int,int>> DIR = { {1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{-1,-1},{1,-1} };
const int INF = -1 + (1<<30);
const int MOD = (int)1e9 + 7;

template<typename T> inline T gcd(T a,T b){ if(a % b){ return gcd(b,a % b); }else{ return b; } }

template<typename T> inline T lcm(T a,T b){ return a / gcd(a,b) * b; }

inline long long Pow(const long long n,long long m,const int mod = MOD){
	long long res = 1,pow = n;
	while(m) {
		if(m & 1) res = (res * pow) % mod;
		pow = (pow * pow) % mod;
		m >>= 1;
	}
	return res;
}

inline vector<long long> Frac(const int range,const int mod = MOD){
	vector<long long> frac;
	frac.push_back(1);
	for(int i = 1; i <= range; ++i) frac.push_back((long long)frac.back() * i % mod);
	return frac;
}

vector<long long> frac;

inline long long Comb(const int n,const int m,const int mod = MOD){
	if(n < m || m < 0) return 0;
	//vector<long long> frac(Frac(n,mod));
	long long rev = Pow((long long)frac[m] * frac[n-m] % mod,mod-2,mod);
	return rev * frac[n] % mod;
}

template<typename T> inline bool v_find(const vector<T> v,const T obj){
	auto itr = find(v.begin(), v.end(), obj);
	size_t index = distance(v.begin(),itr);
	if (index != v.size()) { return true; }
	return false; 
}

template<typename T> inline bool v_erase(vector<T> &v,const T obj){
	auto itr = find(v.begin(), v.end(), obj);
	size_t index = distance(v.begin(),itr);
	if (index != v.size()) {
		v.erase(itr);
		return true;
	}
	return false;	
}

template<class T,class U> inline auto LB(const T v,const U in){ return lower_bound(v.begin(),v.end(),in); }

template<class T,class U> inline auto UB(const T v,const U in){ return upper_bound(v.begin(),v.end(),in); }

inline unsigned long long nextsub(unsigned long long sub){
	unsigned long long tem = sub + (sub & -sub);
	unsigned long long btm = (~(tem) & sub) / (sub & -sub);
	return btm | tem;
}

vector<int> edg[100001];
int n;
bool used[100001]={};

inline void solve(){
	queue<int> que;
	int f_num=0,s_num=0,d[100001],d2[100001];
	que.push(1);
	used[1]=1;
	d[1]=-1;
	while(!que.empty()){
		int v=que.front();
		que.pop();
		rep(i,edg[v].size()){
			if(!used[edg[v][i]]){
				used[edg[v][i]]=1;
				d[edg[v][i]]=d[v]+1;
				que.push(edg[v][i]);
			}
		}
	}
	clr(used);
	used[n]=1;
	que.push(n);
	d2[n]=-1;
	while(!que.empty()){
		int v=que.front();
		que.pop();
		rep(i,edg[v].size()){
			if(!used[edg[v][i]]){
				used[edg[v][i]]=1;
				d2[edg[v][i]]=d2[v]+1;
				que.push(edg[v][i]);
			}
		}
	}
	rep1(i,n){
		if(d[i]>d2[i]) ++s_num;
		else ++f_num;
	}
	if(f_num>s_num) cout<<"Fennec";
	else cout<<"Snuke";
	return;
}

inline void input(){
	int a,b;
	cin>>n;
	rep(i,n-1){
		cin>>a>>b;
		edg[a].pub(b);
		edg[b].pub(a);
	}
	return;
}

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);
	input();
	solve();
	return 0;
}





Measured memory_bytes: 6784