#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > adj;
class LCA {
 private:
  int N, LogV;
  vector<vector<int> > sparse;
  vector<int> depth;

 public:
  void init(int _N) {
    N = _N, LogV = 1 + log2(N),
    sparse.assign(LogV + 5, vector<int>(N + 10, -1)), depth.assign(N + 5, 0),
    adj.resize(N + 10);
  }
  void dfs(int node, int par = -1) {
    for (int it : adj[node]) {
      if (it != par) {
        sparse[0][it] = node;
        depth[it] = depth[node] + 1;
        dfs(it, node);
      }
    }
  }
  inline int distanceOf(int u, int v) { return abs(depth[u] - depth[v]); }
  void sparseTable() {
    for (int i = 1; i < LogV + 2; i++) {
      for (int j = 1; j <= N; j++) {
        int x = sparse[i - 1][j];
        if (x != -1) sparse[i][j] = sparse[i - 1][x];
      }
    }
  }
  int levelUp(int u, int v) {
    int dif = depth[v] - depth[u];
    while (dif > 0) {
      int logDif = log2(dif);
      v = sparse[logDif][v];
      dif -= (1 << logDif);
    }
    return v;
  }
  int findLCA(int u, int v) {
    if (depth[u] > depth[v]) swap(u, v);
    v = levelUp(u, v);
    if (u == v) return u;
    for (int i = LogV + 2; i >= 0; i--) {
      int x = sparse[i][u];
      int y = sparse[i][v];
      if (x == -1 || y == -1) continue;
      if (x != y) {
        u = x;
        v = y;
      }
    }
    return sparse[0][u];
  }
};
inline void addEdge(int u, int v) {
  adj[u].emplace_back(v);
  adj[v].emplace_back(u);
}
int mx, ans1;
void dfs(int node, int par = -1, int cnt = 0) {
  if (cnt > mx) mx = cnt, ans1 = node;
  for (int it : adj[node]) {
    if (it == par) continue;
    dfs(it, node, cnt + 1);
  }
}
void solve() {
  int n;
  cin >> n;
  adj.resize(n + 1);
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    addEdge(u, v);
  }
  dfs(1);
  int ans2 = ans1;
  mx = 0;
  int maximum = 0;
  dfs(ans2);
  LCA lca;
  lca.init(n);
  lca.dfs(ans1);
  lca.sparseTable();
  int ans3 = -1;
  for (int i = 1; i <= n; i++) {
    if (i == ans2 || i == ans1) continue;
    int lc = lca.findLCA(i, ans2);
    int dis = lca.distanceOf(i, lc);
    if (mx + dis >= maximum) maximum = mx + dis, ans3 = i;
  }
  assert(ans3 != -1);
  cout << maximum << "\n" << ans1 << " " << ans2 << " " << ans3 << "\n";
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int tc = 1;
  while (tc--) {
    solve();
  }
  return 0;
}
