#include <bits/stdc++.h>
using namespace std;
struct State {
  int v1;
  int v2;
  int turn;
  State(int _v1 = -1, int _v2 = -1, int _turn = -1)
      : v1(_v1), v2(_v2), turn(_turn) {}
};
const int LIM = 501;
int used[LIM][LIM][2];
State p[LIM][LIM][2];
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int> > g(n);
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  State start(0, n - 1, 0);
  queue<State> q;
  used[start.v1][start.v2][start.turn] = 1;
  q.push(start);
  State front;
  bool path_found = false;
  while (!q.empty()) {
    front = q.front();
    q.pop();
    if (front.v1 == n - 1 && front.v2 == 0 && front.turn == 0) {
      path_found = true;
      break;
    }
    if (front.turn == 0) {
      for (int i = 0; i < g[front.v1].size(); ++i) {
        int u = g[front.v1][i];
        State next = State(u, front.v2, 1);
        if (!used[next.v1][next.v2][next.turn]) {
          used[next.v1][next.v2][next.turn] = 1;
          p[next.v1][next.v2][next.turn] = front;
          q.push(next);
        }
      }
    } else {
      for (int i = 0; i < g[front.v2].size(); ++i) {
        int u = g[front.v2][i];
        State next = State(front.v1, u, 0);
        if (!used[next.v1][next.v2][next.turn] && next.v1 != next.v2) {
          used[next.v1][next.v2][next.turn] = 1;
          p[next.v1][next.v2][next.turn] = front;
          q.push(next);
        }
      }
    }
  }
  if (!path_found) {
    cout << -1 << endl;
    return 0;
  }
  vector<State> r;
  while (front.v1 != -1) {
    r.push_back(front);
    front = p[front.v1][front.v2][front.turn];
  }
  reverse(r.begin(), r.end());
  cout << r.size() / 2 << endl;
  for (int i = 0; i < r.size(); ++i) {
    if (r[i].turn == 0) {
      cout << r[i].v1 + 1 << ' ';
    }
  }
  cout << endl;
  for (int i = 0; i < r.size(); ++i) {
    if (r[i].turn == 0) {
      cout << r[i].v2 + 1 << ' ';
    }
  }
  cout << endl;
  return 0;
}
