#include <bits/stdc++.h>
using namespace std;
vector<long long int> g[200005];
long long int n;
long long int X, Y;
long long int mxcnt = -1;
vector<long long int> vec;
long long int lvl[200005];
long long int vis[200005];
void dfs(long long int u, long long int p, long long int cnt) {
  if (cnt > mxcnt) {
    mxcnt = cnt;
    X = u;
  }
  for (long long int v : g[u]) {
    if (v == p) continue;
    dfs(v, u, cnt + 1);
  }
}
long long int dfs2(long long int u, long long int p, long long int l) {
  for (long long int v : g[u]) {
    if (v == p) continue;
    long long int tmp = dfs2(v, u, l + 1);
    if (tmp) {
      vec.push_back(u);
      return 1;
    }
  }
  if (l == mxcnt) {
    vec.push_back(u);
    return 1;
  }
  return 0;
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  long long int i;
  long long int u, v;
  for (i = 1; i < n; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1, 0, 0);
  Y = X;
  mxcnt = -1;
  dfs(Y, 0, 0);
  dfs2(X, 0, 0);
  long long int extra = 0;
  long long int node = -1;
  for (i = 1; i <= n; i++) {
    if (i != X && i != Y) {
      node = i;
      break;
    }
  }
  queue<long long int> q;
  for (long long int x : vec) {
    lvl[x] = 0;
    q.push(x);
    vis[x] = 1;
  }
  while (!q.empty()) {
    u = q.front();
    q.pop();
    for (long long int v : g[u]) {
      if (vis[v] == 0) {
        lvl[v] = lvl[u] + 1;
        if (lvl[v] > extra) {
          extra = lvl[v];
          node = v;
        }
        vis[v] = 1;
        q.push(v);
      }
    }
  }
  long long int dis = mxcnt + extra;
  cout << dis << "\n" << X << " " << Y << " " << node << '\n';
}
