#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+50;
const int p=1e9+7;
int n,m,cnt;
int last[N],d[N],ini[N];
struct orz{
int v,s,nex;}e[N*5];
bool vis[N];
void add(int u,int v,int s)
{
cnt++;
e[cnt].v=v;
e[cnt].nex=last[u];
last[u]=cnt;
e[cnt].s=s;
}
bool spfa()
{
queue<int>q;
for (int i=1;i<=n;i++) d[i]=inf;
vis[0]=1; d[0]=0;
q.push(0); ini[0]++;
while (!q.empty())
{
int now=q.front(); q.pop();
for (int i=last[now];i!=-1;i=e[i].nex)
{
int to=e[i].v;
if (d[to]>d[now]+e[i].s)
{
d[to]=d[now]+e[i].s;
if (!vis[to])
{
vis[to]=1; q.push(to);
ini[to]++;
if (ini[to]>n) return 0;
}
}
}
vis[now]=0;
}
return 1;
}
int main()
{
memset(last,-1,sizeof(last));
scanf("%d%d",&n,&m);
int x,y,z;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(y,x,z);
}
for (int i=1;i<=n;i++) add(0,i,0);
if (spfa())
{
int mini=d[0];
for (int i=1;i<=n;i++) mini=min(mini,d[i]);
for (int i=1;i<=n;i++) printf("%d
",d[i]-mini);
}
else printf("NO SOLUTION
");
return 0;
}