#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int dis[N][N];
pair<int, int> par[N][N];
vector<int> graph[N];
int n, m;
void pre() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      dis[i][j] = -1;
    }
  }
}
void bfs() {
  queue<pair<int, int> > q;
  q.push({0, n - 1});
  par[0][n - 1] = {-1, -1};
  dis[0][n - 1] = 0;
  while (q.size()) {
    pair<int, int> p = q.front();
    q.pop();
    int x = p.first;
    int y = p.second;
    for (auto u : graph[x]) {
      for (int v : graph[y]) {
        if (u == v) {
          continue;
        }
        if (dis[u][v] == -1) {
          par[u][v] = p;
          dis[u][v] = dis[x][y] + 1;
          q.push({u, v});
        }
      }
    }
  }
}
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    graph[u - 1].push_back(v - 1);
    graph[v - 1].push_back(u - 1);
  }
  pre();
  bfs();
  if (dis[n - 1][0] < 0) {
    cout << -1 << '\n';
    exit(0);
  }
  cout << dis[n - 1][0] << '\n';
  vector<int> path1;
  vector<int> path2;
  pair<int, int> p = {n - 1, 0};
  pair<int, int> check = {-1, -1};
  while (p != check) {
    path1.push_back(p.first);
    path2.push_back(p.second);
    p = par[p.first][p.second];
  }
  reverse(path1.begin(), path1.end());
  reverse(path2.begin(), path2.end());
  for (auto nei : path1) {
    cout << nei + 1 << " ";
  }
  cout << '\n';
  for (auto nei : path2) {
    cout << nei + 1 << " ";
  }
}
