#include <bits/stdc++.h>
using namespace std;
vector<int> vec[2 * (int)1e5 + 5];
int par[2 * (int)1e5 + 5];
pair<int, int> findLeaf(int u, int p, int dep) {
  par[u] = p;
  pair<int, int> ret = {dep, u};
  for (int i = 0; i < vec[u].size(); i++) {
    int v = vec[u][i];
    if (v != p) {
      ret = max(ret, findLeaf(v, u, dep + 1));
    }
  }
  return ret;
}
pair<int, int> bfs(int x, int y) {
  int dist[2 * (int)1e5 + 5] = {};
  memset(dist, 0x0F, sizeof(dist));
  bool vis[2 * (int)1e5 + 5] = {};
  queue<int> q;
  while (y) {
    q.push(y);
    dist[y] = 0;
    vis[y] = true;
    y = par[y];
  }
  pair<int, int> ret = {0, 0};
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < vec[u].size(); i++) {
      int v = vec[u][i];
      if (!vis[v]) {
        vis[v] = true;
        dist[v] = dist[u] + 1;
        ret = max(ret, {dist[v], v});
        q.push(v);
      }
    }
  }
  return ret;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    vec[u].push_back(v);
    vec[v].push_back(u);
  }
  pair<int, int> leaf1 = findLeaf(1, 0, 0);
  pair<int, int> leaf2 = findLeaf(leaf1.second, 0, 0);
  int res = leaf2.first;
  if (res == n - 1) {
    printf("%d\n", res);
    printf("%d %d ", leaf1.second, leaf2.second);
    for (int i = 1; i <= n; i++) {
      if (i == leaf1.second || i == leaf2.second) continue;
      printf("%d\n", i);
      break;
    }
    return 0;
  }
  pair<int, int> ret = bfs(leaf1.second, leaf2.second);
  printf("%d\n", res + ret.first);
  printf("%d %d %d\n", leaf1.second, leaf2.second, ret.second);
}
