#include <bits/stdc++.h>
using namespace std;
int n, m, vis[501][501][2], cost[501][501];
pair<int, int> pp[501][501];
vector<vector<int> > v;
vector<int> ans1, ans2;
void ans(int b, int a) {
  if (b == 1 && a == n) {
    ans1.push_back(b);
    ans2.push_back(a);
    return;
  }
  ans(pp[b][a].first, pp[b][a].second);
  ans1.push_back(b);
  ans2.push_back(a);
}
void BFS(int s, int p) {
  queue<pair<pair<int, int>, pair<int, int> > > q;
  q.push(make_pair(make_pair(s, p), make_pair(1, 0)));
  cost[s][p] = 0;
  vis[s][p][0] = 1;
  while (!q.empty()) {
    int b = q.front().first.first, a = q.front().first.second;
    int k = q.front().second.first, c = q.front().second.second;
    q.pop();
    if (k) {
      for (int i = 0; i < v[b].size(); i++) {
        if (vis[v[b][i]][a][k]) continue;
        vis[v[b][i]][a][k] = 1;
        q.push({{v[b][i], a}, {!k, b}});
      }
    } else {
      for (int i = 0; i < v[a].size(); i++) {
        if (vis[b][v[a][i]][k] || v[a][i] == b) continue;
        vis[b][v[a][i]][k] = 1;
        cost[b][v[a][i]] = cost[c][a] + 1;
        q.push({{b, v[a][i]}, {!k, b}});
        pp[b][v[a][i]] = make_pair(c, a);
      }
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  v.resize(n + 1);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  cost[n][1] = -1;
  BFS(1, n);
  printf("%d\n", cost[n][1]);
  if (cost[n][1] == -1) return 0;
  ans(n, 1);
  for (int i = 0; i < ans1.size(); i++) printf("%d ", ans1[i]);
  puts("");
  for (int i = 0; i < ans2.size(); i++) printf("%d ", ans2[i]);
  return 0;
}
