#include <bits/stdc++.h>
using namespace std;
pair<int, int> p[501][501][2];
bool used[501][501][2];
vector<vector<int>> g;
int n, m;
bool ok = 0;
vector<int> ans1, ans2;
int vis[502];
void dfs(int v) {
  vis[v] = 1;
  for (auto to : g[v]) {
    if (!vis[to]) {
      dfs(to);
    }
  }
}
struct st {
  int a, b, t;
  st() : a(0), b(0), t(0) {}
  st(int a, int b, int t) : a(a), b(b), t(t) {}
};
void bfs() {
  p[0][n - 1][0] = {-1, -1};
  used[0][n - 1][0] = 1;
  queue<st> q;
  q.push(st(0, n - 1, 0));
  while (!q.empty()) {
    int a = q.front().a, b = q.front().b, t = q.front().t;
    q.pop();
    if (t == 0) {
      for (auto to : g[a]) {
        if (!used[to][b][1]) {
          used[to][b][1] = 1;
          p[to][b][1] = {a, b};
          q.push({to, b, 1});
        }
      }
    } else {
      for (auto to : g[b]) {
        if (to == a) continue;
        if (!used[a][to][0]) {
          used[a][to][0] = 1;
          p[a][to][0] = {a, b};
          q.push({a, to, 0});
        }
      }
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m;
  g.resize(n);
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  dfs(0);
  bfs();
  if (!used[n - 1][0][0] || !vis[n - 1]) {
    cout << -1;
    return 0;
  }
  int a = n - 1, b = 0, t = 0;
  ans1.push_back(n - 1), ans2.push_back(0);
  while (p[a][b][t].first != -1) {
    int xa = p[a][b][t].first, xb = p[a][b][t].second;
    t = 1 - t;
    if (t == 0)
      ans1.push_back(xa);
    else
      ans2.push_back(xb);
    a = xa, b = xb;
  }
  reverse(ans1.begin(), ans1.end());
  reverse(ans2.begin(), ans2.end());
  cout << ans1.size() - 1 << '\n';
  for (int i = 0; i < ans1.size(); ++i) {
    cout << ans1[i] + 1 << ' ';
  }
  cout << '\n';
  for (int i = 0; i < ans1.size(); ++i) {
    cout << ans2[i] + 1 << ' ';
  }
  return 0;
}
