#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> graph;
int n, maxi1, maxi2, a, b, c;
bool ok[200001];
void dfs(int curr, int p, int hi, int tag) {
  if (tag == 0) {
    if (hi > maxi1) {
      a = curr;
      maxi1 = hi;
    }
  } else {
    if (hi > maxi1) {
      b = curr;
      maxi1 = hi;
    }
  }
  for (int i : graph[curr]) {
    if (i == p) {
      continue;
    }
    dfs(i, curr, hi + 1, tag);
  }
}
bool dfs2(int curr, int p) {
  if (curr == b) {
    return ok[curr] = true;
  }
  bool okk = false;
  for (int i : graph[curr]) {
    if (i == p) {
      continue;
    }
    if (dfs2(i, curr)) {
      okk = true;
    }
  }
  return ok[curr] = okk;
}
void dfs4(int curr, int p, int hi) {
  if (hi > maxi2) {
    maxi2 = hi;
    c = curr;
  }
  for (int i : graph[curr]) {
    if (i == p) {
      continue;
    }
    dfs4(i, curr, hi + 1);
  }
}
void dfs3(int curr, int p) {
  for (int i : graph[curr]) {
    if (i == p) {
      continue;
    }
    if (ok[i]) {
      dfs3(i, curr);
    } else {
      dfs4(i, curr, 1);
    }
  }
}
int main() {
  cin >> n;
  graph.resize(n + 1);
  for (int i = 0; i < n - 1; i += 1) {
    int a, b;
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  dfs(1, 1, 0, 0);
  maxi1 = 0;
  dfs(a, a, 0, 1);
  dfs2(a, a);
  dfs3(a, a);
  if (c == 0) {
    if (a == 1 || b == 1) {
      if (a == 2 || b == 2) {
        c = 3;
      } else {
        c = 2;
      }
    } else {
      c = 1;
    }
  }
  cout << maxi1 + maxi2 << endl << a << " " << b << " " << c << endl;
}
