#include <bits/stdc++.h>
using namespace std;
struct adat {
  int t, x, y;
  bool operator<(adat d) const { return t > d.t; }
};
const long long DIV = 998244353;
const int logN = 20;
vector<vector<int>> g[2];
vector<array<int, logN>> tav;
vector<bool> volt[2];
int hatvany[logN];
void Dijkstra(int s, int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < logN; j++) tav[i][j] = (int)1e9;
  priority_queue<adat> pq;
  pq.push({0, s, 0});
  while (pq.size() > 0) {
    while (pq.size() > 0 && pq.top().t >= tav[pq.top().x][pq.top().y]) pq.pop();
    if (pq.size() == 0) break;
    int x = pq.top().x, y = pq.top().y, t = pq.top().t;
    pq.pop();
    tav[x][y] = t;
    int r = y & 1;
    for (int p : g[r][x])
      if (tav[p][y] > tav[x][y] + 1) pq.push({tav[x][y] + 1, p, y});
    if (y < logN - 1) {
      for (int p : g[r ^ 1][x])
        if (tav[p][y + 1] > tav[x][y] + hatvany[y] + 1)
          pq.push({tav[x][y] + hatvany[y] + 1, p, y + 1});
    }
  }
  return;
}
void Dijkstra2(int s) {
  priority_queue<pair<int, int>> pq, pq2;
  pq.push(make_pair(0, 0));
  int r = 0;
  long long h = 1, ossz = 0;
  while (pq.size() > 0) {
    while (pq.size() > 0) {
      while (pq.size() > 0 && volt[r][pq.top().second]) pq.pop();
      if (pq.size() == 0) break;
      int x = pq.top().second, t = -pq.top().first;
      pq.pop();
      volt[r][x] = true;
      if (tav[x][0] == (int)1e9) tav[x][0] = ((long long)t + ossz) % DIV;
      for (int p : g[r][x])
        if (!volt[r][p]) pq.push(make_pair(-t - 1, p));
      for (int p : g[r ^ 1][x])
        if (!volt[r ^ 1][p]) pq2.push(make_pair(-t - 1, p));
    }
    r ^= 1;
    swap(pq, pq2);
    while (pq2.size() > 0) pq2.pop();
    ossz = (ossz + h) % DIV;
    h = (h * 2ll) % DIV;
  }
  return;
}
int main() {
  cin.sync_with_stdio(false);
  cin.tie(0);
  hatvany[0] = 1;
  for (int i = 1; i < logN; i++) hatvany[i] = hatvany[i - 1] * 2;
  int n, m;
  cin >> n >> m;
  tav.resize(n);
  g[0].resize(n);
  g[1].resize(n);
  volt[0].assign(n, false);
  volt[1].assign(n, false);
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    g[0][a - 1].push_back(b - 1);
    g[1][b - 1].push_back(a - 1);
  }
  Dijkstra(0, n);
  int legk = (int)1e9;
  for (int i = 0; i < logN; i++) legk = min(legk, tav[n - 1][i]);
  if (legk < (int)1e9) {
    cout << legk << "\n";
    return 0;
  }
  Dijkstra2(0);
  cout << tav[n - 1][0] << "\n";
  return 0;
}
