#include <bits/stdc++.h>
using namespace std;
inline int toInt(string s) {
  int v;
  istringstream sin(s);
  sin >> v;
  return v;
}
template <class T>
inline string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
const long long MOD = 1e9 + 7;
class FThreePathsOnATree {
  pair<int, int> findFarthestVertex(vector<vector<int>>& edges,
                                    const int current, const int previous,
                                    vector<int> forbids, const int distance) {
    pair<int, int> farthestNext = {current, distance};
    for (const auto& next : edges[current]) {
      if (next == previous) continue;
      if (find((forbids).begin(), (forbids).end(), next) != forbids.end())
        continue;
      auto v = findFarthestVertex(edges, next, current, forbids, distance + 1);
      if (farthestNext.second < v.second) {
        farthestNext = v;
      }
    }
    return farthestNext;
  }
  bool getPaths(vector<vector<int>>& edges, const int dst, const int current,
                const int previous, vector<int>& paths) {
    paths.push_back(current);
    if (current == dst) return true;
    for (const auto& next : edges[current]) {
      if (next == previous) continue;
      bool found = getPaths(edges, dst, next, current, paths);
      if (found) return true;
    }
    paths.pop_back();
    return false;
  }

 public:
  void solve(std::istream& in, std::ostream& out) {
    int n;
    in >> n;
    vector<vector<int>> edges(n + 1);
    for (long long i = (0); i < (n - 1); i++) {
      int src, dst;
      in >> src >> dst;
      edges[src].push_back(dst);
      edges[dst].push_back(src);
    }
    int a, b, c;
    int answer = 0;
    a = findFarthestVertex(edges, 1, -1, {}, 0).first;
    pair<int, int> tmp = findFarthestVertex(edges, a, -1, {}, 0);
    b = tmp.first;
    answer += tmp.second;
    vector<int> paths = {};
    getPaths(edges, b, a, -1, paths);
    int maxDistance = 0;
    for (long long i = (1); i < (paths.size() - 1); i++) {
      pair<int, int> v = findFarthestVertex(edges, paths[i], -1,
                                            {paths[i - 1], paths[i + 1]}, 0);
      if (v.second > maxDistance) {
        maxDistance = v.second;
        c = v.first;
      }
    }
    answer += maxDistance;
    if (maxDistance == 0) {
      out << answer << "\n";
      out << a << " " << b << " " << paths[1] << "\n";
    } else {
      out << answer << "\n";
      out << a << " " << b << " " << c << "\n";
    }
  }
};
signed main() {
  FThreePathsOnATree solver;
  std::istream& in(std::cin);
  std::ostream& out(std::cout);
  solver.solve(in, out);
  return 0;
}
