#include <bits/stdc++.h>   using namespace std;   const double eps = 1e-9;   const int inf = 2000000000;   const long long infLL = 9000000000000000000;   template <typename first, typename second>   ostream &operator<<(ostream &os, const pair<first, second> &p) {     return os <<  (  << p.first <<  ,   << p.second <<  ) ;   }   template <typename T>   ostream &operator<<(ostream &os, const vector<T> &v) {     os <<  { ;     for (auto it = v.begin(); it != v.end(); ++it) {       if (it != v.begin()) os <<  ,  ;       os << *it;     }     return os <<  } ;   }   template <typename T>   ostream &operator<<(ostream &os, const set<T> &v) {     os <<  [ ;     for (auto it = v.begin(); it != v.end(); ++it) {       if (it != v.begin()) os <<  , ;       os << *it;     }     return os <<  ] ;   }   template <typename T>   ostream &operator<<(ostream &os, const multiset<T> &v) {     os <<  [ ;     for (auto it = v.begin(); it != v.end(); ++it) {       if (it != v.begin()) os <<  ,  ;       os << *it;     }     return os <<  ] ;   }   template <typename first, typename second>   ostream &operator<<(ostream &os, const map<first, second> &v) {     os <<  [ ;     for (auto it = v.begin(); it != v.end(); ++it) {       if (it != v.begin()) os <<  ,  ;       os << it->first <<   =   << it->second;     }     return os <<  ] ;   }   void faltu() { cerr <<   n ; }   template <typename T>   void faltu(T a[], int n) {     for (int i = 0; i < n; ++i) cerr << a[i] <<    ;     cerr <<   n ;   }   template <typename T, typename... hello>   void faltu(T arg, const hello &...rest) {     cerr << arg <<    ;     faltu(rest...);   }   const int mx = 2e5 + 5;   vector<int> adjlist[mx];   int n;   bool isleaf[mx];   int deg[mx];   struct info {     int leaf, child, dist;   };   bool cmp(const info &lhs, const info &rhs) { return lhs.dist > rhs.dist; }   vector<info> dp[mx];   void dfs(int u, int par) {     vector<info> store;     store.push_back({u, u, 0});     for (auto v : adjlist[u]) {       if (v == par) continue;       dfs(v, u);       info temp = dp[v][0];       ++temp.dist;       temp.child = v;       store.push_back(temp);     }     sort(store.begin(), store.end(), cmp);     while (store.size() > 3) store.pop_back();     dp[u] = store;   }   int ans = 0;   vector<int> vec;   void dfs2(int u, int par) {     if (dp[u].size() >= 3) {       if (ans < dp[u][0].dist + dp[u][1].dist + dp[u][2].dist) {         ans = dp[u][0].dist + dp[u][1].dist + dp[u][2].dist;         vec.clear();         vec.push_back(dp[u][0].leaf);         vec.push_back(dp[u][1].leaf);         vec.push_back(dp[u][2].leaf);       }     }     for (auto v : adjlist[u]) {       if (v == par) continue;       for (int i = 0; i < dp[u].size(); ++i) {         if (dp[u][i].child == v) continue;         info temp = dp[u][i];         temp.child = u;         ++temp.dist;         dp[v].push_back(temp);         sort(dp[v].begin(), dp[v].end(), cmp);         dfs2(v, u);         break;       }     }   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     ;     cin >> n;     for (int i = 0; i < n - 1; ++i) {       int a, b;       cin >> a >> b;       adjlist[a].push_back(b);       adjlist[b].push_back(a);       ++deg[a];       ++deg[b];     }     for (int i = 1; i <= n; ++i) {       if (deg[i] == 1) isleaf[i] = 1;     }     dfs(1, 0);     dfs2(1, 0);     cout << ans <<   n ;     for (int i = 0; i < vec.size(); ++i) cout << vec[i] <<    ;     cout <<   n ;   }