Pagini recente » Cod sursa (job #521688) | Cod sursa (job #2377998) | Cod sursa (job #1136916) | Cod sursa (job #2881068) | Cod sursa (job #1412991)
#include <cstdio>
#include <algorithm>
using namespace std;
int v[10010], prim[200000], k;
bool pm[1000000];
struct triplet
{
int x, y, d;
} a[100010];
inline int cmmdc (int a, int b)
{
while (b)
{
a %= b;
swap (a, b);
}
return a;
}
inline void ciur (int n)
{
for (int i = 2; i <= n; ++i)
if (!pm[i])
{
prim[++k] = i;
for (long long j = 1LL * i * i; j <= n; j += 1LL * i)
pm[j] = true;
}
}
int main ()
{
freopen ("oz.in", "r", stdin);
freopen ("oz.out", "w", stdout);
int n, m;
scanf ("%d %d", &n, &m);
int ma = 0;
for (int i = 1; i <= m; ++i)
{
scanf ("%d %d %d", &a[i].x, &a[i].y, &a[i].d);
ma = max (ma, a[i].d);
}
bool OK = true;
ciur (ma);
for (int i = 1; i <= m; ++i)
{
int xx = a[i].x;
int yy = a[i].y;
int dd = a[i].d;
if (!v[xx]) v[xx] = dd;
if (!v[yy]) v[yy] = dd;
int cdd = dd;
for (int j = 1; j <= k && cdd != 1; ++j)
if (!(cdd % prim[j]))
if (!(v[xx] % prim[j]))
{
int cv = v[xx];
while ((!(cv % prim[j])) && (!(dd % prim[j]))) cdd /= prim[j], cv /= prim[j];
}
long long z = 1LL * cdd * v[xx];
if (z > 2000000000LL)
{
OK = false;
break;
}
v[xx] = z;
for (int j = 1; j <= k && dd != 1; ++j)
if (!(dd % prim[j]))
if (!(v[yy] % prim[j]))
{
int cv = v[yy];
while ((!(cv % prim[j])) && (!(dd % prim[j]))) dd /= prim[j], cv /= prim[j];
}
z = 1LL * dd * v[yy];
if (z > 2000000000LL)
{
OK = false;
break;
}
v[yy] = z;
}
if (!OK)
{
printf ("-1\n");
return 0;
}
for (int i = 1; i <= n && OK; ++i)
if (!v[i]) OK = false;
if (!OK)
{
printf ("-1\n");
return 0;
}
for (int i = 1; i <= m && OK; ++i)
{
int p = cmmdc (v[a[i].x], v[a[i].y]);
if (p != a[i].d) OK = false;
}
if (!OK)
{
printf ("-1\n");
return 0;
}
for (int i = 1; i <= n; ++i)
printf ("%d ", v[i]);
printf ("\n");
return 0;
}