//#pragma comment(linker, "/stack:200000000")
	//#pragma GCC optimize("Ofast")
	//#pragma GCC optimize(3)
	//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
	//#pragma GCC target("sse3","sse2","sse")
	//#pragma GCC target("avx","sse4","sse4.1","sse4.2","ssse3")
	//#pragma GCC target("f16c")
	//#pragma GCC optimize("inline","fast-math","unroll-loops","no-stack-protector")
	//#pragma GCC diagnostic error "-fwhole-program"
	//#pragma GCC diagnostic error "-fcse-skip-blocks"
	//#pragma GCC diagnostic error "-funsafe-loop-optimizations"
	//#pragma GCC diagnostic error "-std=c++14"
	#include<bits/stdc++.h>
	#define MST(a,b) memset(a,b,sizeof(a))
	#define pb push_back
	#define eb emplace_back
	#define rep(i,a,b) for(int i = a ; i < b ; ++i)
	#define per(i,a,b) for(int i = a ; i > b ; --i)
	#define ALL(v) v.begin(),v.end()
	#define ft first
	#define sd second
	using namespace std;
	
	typedef long long LL;
	typedef pair<int,int> pii;
	template<class T> void show(T *x,int len,int s = 0) {for(int i = s ; i < s+len-1 ; ++i) cerr << x[i] << ' ';cerr << x[s+len-1] << endl;}
	void debug() {cerr << endl;}
	template <typename T, typename... Args> void debug(T x,Args... args) {cerr << x << ' ';debug(args...);}
	
	namespace fast_IO{
		const int maxbuff = 1<<17;
		char ibuff[maxbuff],obuff[maxbuff];
		inline char Getchar(){
		    static char *p1=ibuff,*p2=ibuff;
			if(p1 == p2) {
		    	p1 = ibuff;
		    	p2 = ibuff+fread(ibuff,1,maxbuff,stdin);
		    	if(p1 == p2) return -1;
		    }
		    return *p1++;
		}
	
		int optr = 0;
		inline void Putchar(char c) {
			if(optr == maxbuff) {fwrite(obuff,1,optr,stdout);optr = 0;}
			obuff[optr++] = c;
		}
	
		inline void Flush() {
			fwrite(obuff,1,optr,stdout);
		}
	
		template<class T>
			inline int read(T &x) {
				x = 0;
				char c = Getchar();
				if(c == EOF) return -1;
				for( ; (c < '0' || c > '9') && c != EOF ; c = Getchar());
				if(c == EOF) return -1;
				for( ; c >= '0' && c <= '9' ; c = Getchar()) x = x*10+c-'0';
				return 0;
			}
	
		template<class T>
			inline void write(const T &x,int tag = 0) {
				if(!x) {
					if(!tag) Putchar(x+'0');
					return ;
				}
				write(x/10,1);
				Putchar(x%10+'0');
			}
	
		template<class T>
			inline void writeln(const T &x) {
				write(x);Putchar('\n');
			}
	
		template<class T>
			inline void writesp(const T &x) {
				write(x);Putchar(' ');
			}
	}
	template<class T>
	inline void cmin(T &A,const T &B) {A = (A<B?A:B);}
	template<class T>
	inline void cmax(T &A,const T &B) {A = (A>B?A:B);}
	
	const int N = 3e5+19;
	vector<int> e[N];
	int f[N],n,mx,rt,d[N],num;
	
	void dfs(int u,int p) {
		for(auto v : e[u]) if(v != p) {
			f[v] = f[u]+1;
			dfs(v,u);
		}
	}
	
	int check() {
		if(mx%2==0) return 0;
		int p = mx/2+1,pp = 0,ppp;
		for(int i = 1 ; i <= n ; ++i) 
			if(f[i] == p) {
				++pp;
				ppp = i;
			}
		if(pp > 1) return 0;
		MST(f,0);
		f[ppp] = 1;
		dfs(ppp,0);
		int q = -1;
		for(int i = 1 ; i <= n ; ++i) q = max(q,f[i]);
		pp = 0;
		for(int i = 1 ; i <= n ; ++i) if(f[i] == q) ++pp;
		if(pp > 2) return 1;
		else return 0;
	}
	
		
	
	int main(){
		cin >> n;
		for(int i = 1 ; i < n ; ++i) {
			int u,v;
			cin >> u >> v;
			e[u].pb(v);
			e[v].pb(u);
			++d[v];++d[u];
		}
		for(int i = 1 ; i <= n ; ++i) if(d[i] == 1) ++num;
		f[1] = 1;
		dfs(1,0);
		rt = 0;mx = -1;
		for(int i = 1 ; i <= n ; ++i) 
			if(f[i] > mx) {
				rt = i;
				mx = f[i];
			}
		MST(f,0);
		f[rt] = 1;
		dfs(rt,0);
		mx = -1;
		for(int i = 1 ; i <= n ; ++i) mx = max(f[i],mx);
		int ans = (mx % 3 != 2);
		if(ans) puts("First");
		else puts("Second");
		return 0;
	}
			

Measured memory_bytes: 24832