#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int NAX = 2e5 + 5, MOD = 1000000007;
int p[NAX];
vector<int> adj[NAX];
class Solution {
 private:
  pair<int, int> dfs(int node, int par = -1, int dist = 0) {
    p[node] = par;
    pair<int, int> res = {dist, node};
    for (auto &child : adj[node])
      if (child != par) res = max(res, dfs(child, node, dist + 1));
    return res;
  }

 public:
  Solution() {}
  ~Solution() {}
  void solveCase() {
    int n;
    cin >> n;
    for (size_t i = 1; i < n; i++) {
      int x, y;
      cin >> x >> y;
      --x, --y;
      adj[x].push_back(y);
      adj[y].push_back(x);
    }
    pair<int, int> da = dfs(0);
    pair<int, int> db = dfs(da.second);
    vector<int> diam;
    int v = db.second;
    while (v != da.second) {
      diam.push_back(v);
      v = p[v];
    }
    diam.push_back(da.second);
    if (diam.size() == n) {
      cout << n - 1 << '\n';
      cout << diam.front() + 1 << ' ' << diam.back() + 1 << ' ' << diam[1] + 1
           << '\n';
    } else {
      queue<int> q;
      vector<int> d(n, -1);
      for (auto &x : diam) {
        q.push(x);
        d[x] = 0;
      }
      while (q.size()) {
        int v = q.front();
        q.pop();
        for (auto &child : adj[v])
          if (d[child] == -1) {
            d[child] = d[v] + 1;
            q.push(child);
          }
      }
      pair<int, int> mx = {d[0], 0};
      for (size_t v = 0; v < n; v++) mx = max(mx, {d[v], v});
      cout << diam.size() - 1 + mx.first << '\n';
      cout << diam.front() + 1 << ' ' << mx.second + 1 << ' ' << diam.back() + 1
           << '\n';
    }
  }
};
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int t = 1;
  Solution mySolver;
  for (int i = 1; i <= t; ++i) {
    mySolver.solveCase();
  }
  return 0;
}
