#include <bits/stdc++.h>
using namespace std;
const int N = 555;
long long dis[N][N][2], n, m, a, b, x, y, u, v, w, k1, k2, W, U;
vector<int> nei[N], oneton, ntoone;
bool mark[N][N][2], p, r, R;
pair<pair<int, int>, bool> par[N][N][2], k;
queue<pair<pair<int, int>, bool> > q;
void bfs() {
  q.push({{0, n - 1}, 0});
  while (!q.empty()) {
    k = q.front();
    k1 = k.first.first, k2 = k.first.second;
    p = k.second;
    if (!p) {
      for (int i = 0; i < nei[k1].size(); i++) {
        v = nei[k1][i];
        if (!mark[v][k2][!p]) {
          mark[v][k2][!p] = 1;
          dis[v][k2][!p] = dis[k1][k2][p] + 1;
          par[v][k2][!p] = {{k1, k2}, p};
          q.push({{v, k2}, !p});
        }
      }
    } else {
      for (int i = 0; i < nei[k2].size(); i++) {
        v = nei[k2][i];
        if (!mark[k1][v][!p] && k1 != v) {
          mark[k1][v][!p] = 1;
          dis[k1][v][!p] = dis[k1][k2][p] + 1;
          par[k1][v][!p] = {{k1, k2}, p};
          q.push({{k1, v}, !p});
        }
      }
    }
    q.pop();
  }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> a >> b;
    a--, b--;
    nei[a].push_back(b);
    nei[b].push_back(a);
  }
  bfs();
  if (!mark[n - 1][0][0]) {
    cout << -1;
    return 0;
  }
  u = n - 1, w = 0;
  oneton.push_back(u);
  ntoone.push_back(w);
  while (u != 0 || w != n - 1 || r) {
    U = u, W = w, R = r;
    u = par[U][W][R].first.first;
    w = par[U][W][R].first.second;
    r = !R;
    if (!r)
      oneton.push_back(u);
    else
      ntoone.push_back(w);
  }
  cout << oneton.size() - 1 << endl;
  for (int i = oneton.size() - 1; i >= 0; i--) cout << oneton[i] + 1 << " ";
  cout << endl;
  for (int i = ntoone.size() - 1; i >= 0; i--) cout << ntoone[i] + 1 << " ";
}
