#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#define MAXN 110
using namespace std;
struct Node
{
int v;
int weight;
Node(int _v,int _weight):v(_v),weight(_weight){}
};
int N,M;
vector<Node> Adj[MAXN];
int ve[MAXN];
int Indegree[MAXN];
void TopSort(){
fill(ve,ve+N,0);
int cnt=0;
int leastTime=0;//出口一定是最长耗时
queue<int> q;
for(int i=0;i<N;i++){//计算入度
for(int j=0;j<Adj[i].size();j++){
Indegree[Adj[i][j].v]++;
}
}
for(int i=0;i<N;i++){//初始入度为0入队
if(Indegree[i]==0) q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();cnt++;
for(int i=0;i<Adj[u].size();i++){
int v=Adj[u][i].v;
if(--Indegree[v]==0){
q.push(v);
}
if(ve[u]+Adj[u][i].weight>ve[v]){
ve[v]=ve[u]+Adj[u][i].weight;//前驱最长路径
}
if(ve[v]>leastTime) leastTime=ve[v];//记录结点中的最长耗时
}
}
if(cnt!=N) printf("Impossible");
else printf("%d",leastTime);
}
int main(){
scanf("%d %d",&N,&M);
int tmp1,tmp2,tmpl;
for(int i=0;i<M;i++){
scanf("%d %d %d",&tmp1,&tmp2,&tmpl);
Adj[tmp1].push_back(Node(tmp2,tmpl));
}
TopSort();
return 0;
}