#include <bits/stdc++.h>
using namespace std;
const int N = 501;
int n, m;
vector<int> v[N], path[2];
struct GRAPH {
  int a, b, who;
};
GRAPH previ[N][N][2];
bool odw[N][N][2], found;
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    v[a].push_back(b);
    v[b].push_back(a);
  }
  queue<GRAPH> q;
  q.push({1, n, 0});
  while (q.size() && !found) {
    GRAPH curr = q.front();
    q.pop();
    if (curr.who == 0)
      for (int i = 0; i < v[curr.a].size(); ++i) {
        GRAPH u;
        u.a = v[curr.a][i];
        u.b = curr.b;
        u.who = 1;
        if (!odw[u.a][u.b][u.who]) {
          odw[u.a][u.b][u.who] = 1;
          previ[u.a][u.b][u.who] = curr;
          q.push(u);
          if (u.a == n && u.b == 1 && u.who == 0) {
            found = 1;
            break;
          }
        }
      }
    else
      for (int i = 0; i < v[curr.b].size(); ++i) {
        GRAPH u;
        u.a = curr.a;
        u.b = v[curr.b][i];
        u.who = 0;
        if (u.a == u.b) continue;
        if (!odw[u.a][u.b][u.who]) {
          odw[u.a][u.b][u.who] = 1;
          previ[u.a][u.b][u.who] = curr;
          q.push(u);
          if (u.a == n && u.b == 1 && u.who == 0) {
            found = 1;
            break;
          }
        }
      }
  }
  if (!found)
    cout << "-1";
  else {
    GRAPH curr;
    curr.a = n;
    curr.b = 1;
    curr.who = 0;
    while (curr.a != 1 || curr.b != n || curr.who != 0) {
      if (curr.who == 0) {
        path[0].push_back(curr.a);
        path[1].push_back(curr.b);
      }
      curr = previ[curr.a][curr.b][curr.who];
    }
    printf("%d\n1 ", (int)path[0].size());
    for (int i = path[0].size() - 1; i >= 0; --i) printf("%d ", path[0][i]);
    printf("\n%d ", n);
    for (int i = path[1].size() - 1; i >= 0; --i) printf("%d ", path[1][i]);
  }
}
