rt. 可以给组 hack 吗,自己拍了没拍出来(
#include "bits/stdc++.h"
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define ull unsigned long long
#define OPEN freopen (".in", "r", stdin); freopen (".out", "w", stdout);
#define DATA freopen (".in", "w", stdout);
#define pc __builtin_popcount
#define db double
#define pii pair<int, int>
#define fi first
#define se second
#define F(i,x,y) for (int i = (x); i <= (y); ++i)
#define D(i,x,y) for (int i = (x); i >= (y); --i)
using namespace std;
const ll inf = 1ll * 1e18;
const ll mod = 998244353ll;
//const ll mod = 1ll * 1e9 + 7ll;
namespace FastIO {
inline void Rd(int& x) {
int f = 1;
x = 0;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c - 48), c = getchar();
x *= f;
}
inline void Wt(int x) {
if (x < 10) {
putchar(x + 48);
return;
}
Wt(x / 10);
putchar((x % 10) + 48);
}
}
namespace Maths {
ll fac[560000];
void init() {
fac[0] = 1ll;
F(i, 1, 500000) fac[i] = fac[i - 1] * i % mod;
}
ll qpow(ll x, ll y) {
if (y == 0ll) return 1ll;
ll w = qpow(x, y / 2ll);
if (y % 2ll) return (w * w % mod) * x % mod;
else return w * w % mod;
}
inline ll C(ll x, ll y) {
return (fac[x] * qpow(fac[y], mod - 2ll) % mod) * qpow(fac[x - y], mod - 2ll) % mod;
}
inline ll div(ll x) {
return qpow(x, mod - 2ll);
}
}
int n, m;
ll ans = 0ll;
struct Edge {
int to, nxt, dis;
};
struct Graph {
Edge e[1300000];
int hd[310000];
int cnt;
int vis[310000];
ll dis[310000];
int dep[310000];
void Addedge (int x, int y, int d) {
++ cnt;
e[cnt].to = y;
e[cnt].dis = d;
e[cnt].nxt = hd[x]; hd[x] = cnt;
}
void Dfs (int now) {
vis[now] = 1;
for (int i = hd[now]; i; i = e[i].nxt) {
if (! vis[e[i].to]) Dfs (e[i].to);
}
}
void Tarjan (int now) {
for (int i = hd[now]; i; i = e[i].nxt) {
int v = e[i].to, d = e[i].dis;
if (! vis[v]) {
vis[v] = 1; dis[v] = dis[now] + d;
dep[v] = dep[now] + 1;
Tarjan (v);
} else {
if (dep[v] < dep[now]) {
// cerr << "L117 " << now << ' ' << v << ' ' << d << ' ' << 1ll * abs(dis[now] - dis[v] + d) << '\n';
ans = __gcd (ans, 1ll * abs(dis[now] - dis[v] + d));
}
}
}
}
}e1, e2, e3;
int a[310000];
int main() {
// OPEN
// IOS
cin >> n >> m;
F(i, 1, m) {
int u, v;
cin >> u >> v;
e1.Addedge(u, v, 1);
e2.Addedge(v, u, 1);
}
e1.Dfs(1);
e2.Dfs(n);
F(i, 1, n) cin >> a[i];
F(i, 1, n) {
if (! e1.vis[i] || ! e2.vis[i]) continue;
if (a[i] != -1) e3.Addedge(i, i + n, a[i]);
if (a[i] != -1) e3.Addedge(i + n, i, -a[i]);
for (int j = e1.hd[i]; j; j = e1.e[j].nxt) {
int v = e1.e[j].to;
if (! e1.vis[v] || ! e2.vis[v]) continue;
e3.Addedge (i + n, v, 0);
e3.Addedge (v, i + n, 0);
}
}
e3.Addedge (1, n << 1, 0);
e3.Addedge (n << 1, 1, 0);
F(i, 1, n) {
if (! e1.vis[i] || !e2.vis[i] || e3.vis[i]) continue;
e3.Tarjan (i);
}
F(i, n + 1, n << 1) {
if (! e1.vis[i - n] || !e2.vis[i - n] || e3.vis[i]) continue;
e3.Tarjan (i);
}
if (ans == 0ll) cout << "-1\n";
else cout << ans << '\n';
}