#include <bits/stdc++.h>
using namespace std;
template <typename C>
void MA(C& a, C b) {
  if (a < b) a = b;
}
template <typename C>
void MI(C& a, C b) {
  if (a > b) a = b;
}
int n, m;
bitset<151> pom;
struct mac {
  bitset<151> t[151];
  void dod(int a, int b) { t[a][b] = 1; }
  void mnu(mac& a, mac& b) {
    for (int i = 0; i < n; i++) {
      t[i] = pom;
      for (int j = 0; j < n; j++) {
        if (a.t[i][j]) t[i] |= b.t[j];
      }
    }
  }
} ak, dm, lo[35], kan;
int t = 0;
int odp(int i) {
  while (i) {
    i--;
    kan.mnu(dm, lo[i]);
    if (kan.t[0][n - 1] == 0) {
      dm = kan;
      t += 1 << i;
    }
  }
  printf("%d\n", t + 1);
  exit(0);
}
vector<pair<int, pair<int, int> > > w;
void pot(int wyk) {
  lo[0] = ak;
  int i = 0;
  while (wyk) {
    if (wyk & 1) {
      kan.mnu(dm, lo[i]);
      if (kan.t[0][n - 1]) {
        odp(i);
      }
      dm = kan;
      t += 1 << i;
    }
    wyk /= 2;
    lo[i + 1].mnu(lo[i], lo[i]);
    i++;
  }
}
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  ak.dod(n - 1, n - 1);
  for (int i = 0; i < n; i++) {
    dm.dod(i, i);
  }
  for (int i = 0; i < m; i++) {
    int a, b, d;
    scanf("%d%d", &a, &b);
    a--;
    b--;
    scanf("%d", &d);
    w.push_back({d, make_pair(a, b)});
  }
  sort((w).begin(), (w).end());
  int i = 0;
  w.push_back({(int)1e9 + 200, {0, 0}});
  while (i < m) {
    while (i < m && w[i].first == t) {
      ak.dod(w[i].second.first, w[i].second.second);
      i++;
    }
    pot(w[i].first - t);
  }
  puts("Impossible");
}
