// Original C++ solution (slower):
//#pragma GCC optimize("Ofast")

//#pragma GCC target("avx,avx2,fma")



#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>

#include <ext/pb_ds/tree_policy.hpp>

#define pb push_back

#define F first

#define S second

#define ins insert

#define mp make_pair

#define fo(i, n1, n, x) for(int i = n1; i <= n; i += x)

#define foo(i, n, n1, x) for(int i = n; i >= n1; i -= x)

#define bit __builtin_popcount

#define md (l + ((r - l) / 2))

#define all(x) x.begin(),x.end()

#define eb emplace_back

#define ub upper_bound

#define lb lower_bound

#define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)

#define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)



using namespace std;

using namespace __gnu_pbds;



typedef long long ll;

typedef long double ld;



const int N = 2e5 + 11, mod = 1e9 + 7, mod2 = 998244353;

const ll MAX = 1e15 + 11;

const int INF1 = 2e9 + 11;

const ll INF2 = 2e18 + 11;

const double INF3 = 1e8 + 11;

const int base = 500;

const int P = 31;

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

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

const double EPS = 1e-4;

const double PI = acos(-1.0);





template<typename T> using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;

template<typename T1, typename T2> inline void chmin(T1 &a, T2 b) { if (a > b) a = b; }

template<typename T1, typename T2> inline void chmax(T1 &a, T2 b) { if (a < b) a = b; }





typedef pair <int, int> pii;

typedef pair <ll, ll> pll;





mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());



int n, r, mx;

vector <int> g[N];

void dfs(int v, int pr, int dist) {

    if (mx < dist) {

        mx = dist;

        r = v;

    }

    for (int to : g[v]) {

        if (to != pr) dfs(to, v, dist + 1);

    }

}

main() {

    file("rmq");

    ios;

    cin >> n;

    fo(i, 1, n - 1, 1) {

        int u, v;

        cin >> u >> v;

        g[u].eb(v);

        g[v].eb(u);

    }

    dfs(1, 1, -1);

    mx = -1;

    dfs(r, r, -1);

    if (mx % 3) cout << "First";

    else cout << "Second";

    return 0;

}

/**



*/


// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;

#define Maxn 400007

int last[Maxn],pre[Maxn],other[Maxn],cnt=0;

int dis[Maxn];

bool vis[Maxn];

void insert(int u,int v)

{

    other[++cnt]=v,pre[cnt]=last[u],last[u]=cnt;

}

void dfs(int u)

{

    vis[u]=true;

    for (int q=last[u];q;q=pre[q])

    {

        int v=other[q];

        if (!vis[v])

        {

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

            dfs(v);

        }

    }

}

int n;

int main()

{

    scanf("%d",&n);

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

    {

        int u,v;

        scanf("%d%d",&u,&v);

        insert(u,v),insert(v,u);

    }

    memset(vis,false,sizeof(vis));

    dis[1]=0;

    dfs(1);

    int id=1;

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

        if (dis[i]>dis[id]) id=i;

    memset(vis,false,sizeof(vis));

    dis[id]=0;

    dfs(id);

    int ans=0;

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

        ans=max(ans,dis[i]);

    if (ans%3==1) printf("Second\n"); else printf("First\n");

    return 0;

}

// Fastest known solution for this problem: