/*
* @Author: hungeazy
* @Date: 2025-10-21 09:24:36
* @Last Modified by: hungeazy
* @Last Modified time: 2025-10-21 14:20:05
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
using namespace std;
using namespace __gnu_pbds;
bool M1;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ll long long
#define ull unsigned long long
#define sz(x) x.size()
#define sqr(x) (1LL * (x) * (x))
#define all(x) x.begin(), x.end()
#define fill(f,x) memset(f,x,sizeof(f))
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define debug(x) cout << #x << " = " << x << '\n'
#define ii pair<int,int>
#define iii pair<int,ii>
#define di pair<ii,ii>
#define vi vector<int>
#define vii vector<ii>
#define mii map<int,int>
#define fi first
#define se second
#define pb push_back
#define MOD 1000000007
#define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
#define YES cout << "YES\n"
#define NO cout << "NO\n"
#define MASK(i) (1LL << (i))
#define c_bit(i) __builtin_popcountll(i)
#define BIT(x,i) ((x) & MASK(i))
#define SET_ON(x,i) ((x) | MASK(i))
#define SET_OFF(x,i) ((x) & ~MASK(i))
#define oo 1e18
#define name ""
#define endl '\n'
#define memory() cerr << abs(&M2-&M1)/1024.0/1024 << " MB" << endl
#define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms." << endl
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
const int N = (int)2e5+10;
int n,m;
vii g[N];
array<int,3> edge[N];
map<ii,int> val;
namespace sub1 {
int par[N][20],h[N],lo[N];
bool approved() {
return m == n-1;
}
void DFS(int u, int p)
{
for (auto [v,w] : g[u])
if (v != p)
{
par[v][0] = u;
h[v] = h[u]+1;
DFS(v,u);
}
}
void init()
{
lo[1] = 0;
FOR(i,2,N-10) lo[i] = lo[i/2]+1;
FOR(j,1,lo[n])
FOR(i,1,n)
par[i][j] = par[par[i][j-1]][j-1];
}
int LCA(int x, int y)
{
if (h[x] < h[y]) swap(x,y);
int z = lo[n];
FOD(i,z,0)
if (h[x]-h[y] >= MASK(i)) x = par[x][i];
if (x == y) return x;
FOD(i,z,0)
if (par[x][i] != par[y][i])
{
x = par[x][i];
y = par[y][i];
}
return par[x][0];
}
void solve(void)
{
DFS(1,-1);
init();
vi vec,vec2;
int u = 1, v = n, lca = LCA(u,v);
while (u != lca)
{
vec.pb(u);
u = par[u][0];
}
while (v != lca)
{
vec2.pb(v);
v = par[v][0];
}
vec2.pb(lca);
reverse(all(vec2));
for (int x : vec2) vec.pb(x);
int pre = 0, ans = 0;
FOR(i,0,sz(vec)-2)
{
ans += abs(val[{vec[i],vec[i+1]}]-pre);
pre = val[{vec[i],vec[i+1]}];
}
cout << ans;
}
}
namespace sub2 {
int d[N][11];
bool approved() {
FOR(i,1,m)
if (edge[i][2] > 10) return false;
return true;
}
void Dijkstra(int p)
{
FOR(i,1,n)
FOR(j,1,10) d[i][j] = oo;
d[p][0] = 0;
priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> q;
q.push({0,p,0});
while (!q.empty())
{
auto [cost,u,W] = q.top();
q.pop();
if (cost > d[u][W]) continue;
for (auto [v,w] : g[u])
if (minimize(d[v][w],d[u][W]+abs(w-W)))
q.push({d[v][w],v,w});
}
}
void solve(void)
{
Dijkstra(1);
int ans = oo;
FOR(i,1,10) minimize(ans,d[n][i]);
cout << ans;
}
}
namespace sub3 {
unordered_map<int,int> d;
bool approved() {
FOR(i,1,m)
if (edge[i][2] > 10) return false;
return true;
}
int convert(int x, int y) {
return (x<<31LL)+y;
}
void Dijkstra(int p)
{
d[convert(p,0)] = 0;
priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> q;
q.push({0,p,0});
while (!q.empty())
{
auto [cost,u,W] = q.top();
q.pop();
if (u == n)
{
cout << cost;
return;
}
if (cost > d[convert(u,W)]) continue;
for (auto [v,w] : g[u])
if (!d.count(convert(v,w)) or minimize(d[convert(v,w)],d[convert(u,W)]+abs(w-W)))
{
d[convert(v,w)] = d[convert(u,W)]+abs(w-W);
q.push({d[convert(v,w)],v,w});
}
}
}
void solve(void)
{
Dijkstra(1);
}
}
namespace sub4 {
vii G[N];
vi adj[N];
int d[N];
void Dijkstra(int p)
{
FOR(i,0,m) d[i] = oo;
d[p] = 0;
priority_queue<ii,vii,greater<ii>> q;
q.push({0,p});
while (!q.empty())
{
auto [cost,u] = q.top();
q.pop();
if (cost > d[u]) continue;
for (auto [v,w] : G[u])
if (minimize(d[v],d[u]+w))
q.push({d[v],v});
}
}
void solve(void)
{
FOR(i,1,m)
{
auto [u,v,w] = edge[i];
adj[u].pb(i); adj[v].pb(i);
}
FOR(i,1,n)
{
if (sz(adj[i]) <= 1) continue;
sort(all(adj[i]),[&](int x, int y) {
return edge[x][2] < edge[y][2];
});
FOR(j,1,sz(adj[i])-1)
{
int u = adj[i][j-1], v = adj[i][j];
int w = abs(edge[u][2]-edge[v][2]);
G[u].pb({v,w}); G[v].pb({u,w});
}
}
FOR(i,1,m)
if (edge[i][0] == 1 or edge[i][1] == 1)
G[0].pb({i,edge[i][2]});
Dijkstra(0);
int ans = oo;
FOR(i,1,m)
if (edge[i][0] == n or edge[i][1] == n)
minimize(ans,d[i]);
cout << ans;
}
}
bool M2;
signed main()
{
fast;
if (fopen(name".inp","r"))
{
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
cin >> n >> m;
FOR(i,1,m)
{
int u,v,w;
cin >> u >> v >> w;
g[u].pb({v,w}); g[v].pb({u,w});
edge[i] = {u,v,w};
val[{u,v}] = val[{v,u}] = w;
}
if (sub1::approved()) return sub1::solve(), time(), memory(), 0;
if (sub2::approved()) return sub2::solve(), time(), memory(), 0;
if (sub3::approved()) return sub3::solve(), time(), memory(), 0;
sub4::solve();
time();
memory();
return 0;
}
// ██░ ██ █ ██ ███▄ █ ▄████
//▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
//▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
//░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
//░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
// ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
// ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
// ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
// ░ ░ ░ ░ ░ ░
LyoKKiBAQXV0aG9yOiBodW5nZWF6eQoqIEBEYXRlOiAgIDIwMjUtMTAtMjEgMDk6MjQ6MzYKKiBATGFzdCBNb2RpZmllZCBieTogICBodW5nZWF6eQoqIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjUtMTAtMjEgMTQ6MjA6MDUKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4gCiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPiAKLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikgIAovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgidW5yb2xsLWxvb3BzIikgIAovLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIscG9wY250LGx6Y250IikgIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsgCmJvb2wgTTE7CiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxsIGxvbmcgbG9uZyAKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgc3ooeCkgeC5zaXplKCkKI2RlZmluZSBzcXIoeCkgKDFMTCAqICh4KSAqICh4KSkKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgZmlsbChmLHgpIG1lbXNldChmLHgsc2l6ZW9mKGYpKQojZGVmaW5lIEZPUihpLGwscikgZm9yKGludCBpPWw7aTw9cjtpKyspCiNkZWZpbmUgRk9EKGkscixsKSBmb3IoaW50IGk9cjtpPj1sO2ktLSkKI2RlZmluZSBkZWJ1Zyh4KSBjb3V0IDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBpaWkgcGFpcjxpbnQsaWk+CiNkZWZpbmUgZGkgcGFpcjxpaSxpaT4KI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8aWk+CiNkZWZpbmUgbWlpIG1hcDxpbnQsaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBfX2xjbShhLGIpICgxbGwgKiAoKGEpIC8gX19nY2QoKGEpLCAoYikpKSAqIChiKSkKI2RlZmluZSBZRVMgY291dCA8PCAiWUVTXG4iCiNkZWZpbmUgTk8gY291dCA8PCAiTk9cbiIKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIGNfYml0KGkpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKGkpCiNkZWZpbmUgQklUKHgsaSkgKCh4KSAmIE1BU0soaSkpCiNkZWZpbmUgU0VUX09OKHgsaSkgKCh4KSB8IE1BU0soaSkpCiNkZWZpbmUgU0VUX09GRih4LGkpICgoeCkgJiB+TUFTSyhpKSkKI2RlZmluZSBvbyAxZTE4CiNkZWZpbmUgbmFtZSAiIgojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIG1lbW9yeSgpIGNlcnIgPDwgYWJzKCZNMi0mTTEpLzEwMjQuMC8xMDI0IDw8ICIgTUIiIDw8IGVuZGwKI2RlZmluZSB0aW1lKCkgY2VyciA8PCBlbmRsIDw8ICItLS0tLS0tLS0tLS0tVGltZToiIDw8IDEwMDAuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQyA8PCAibXMuIiA8PCBlbmRsCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgbWF4aW1pemUoVCAmcmVzLCBjb25zdCBUICZ2YWwpIHsgaWYgKHJlcyA8IHZhbCl7IHJlcyA9IHZhbDsgcmV0dXJuIHRydWU7IH07IHJldHVybiBmYWxzZTsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIG1pbmltaXplKFQgJnJlcywgY29uc3QgVCAmdmFsKSB7IGlmIChyZXMgPiB2YWwpeyByZXMgPSB2YWw7IHJldHVybiB0cnVlOyB9OyByZXR1cm4gZmFsc2U7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IHVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZSA8VCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsIDxUPiwgcmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKY29uc3QgaW50IE4gPSAoaW50KTJlNSsxMDsKaW50IG4sbTsKdmlpIGdbTl07CmFycmF5PGludCwzPiBlZGdlW05dOwptYXA8aWksaW50PiB2YWw7CgpuYW1lc3BhY2Ugc3ViMSB7CgoJaW50IHBhcltOXVsyMF0saFtOXSxsb1tOXTsKCglib29sIGFwcHJvdmVkKCkgewoJCXJldHVybiBtID09IG4tMTsKCX0KCgl2b2lkIERGUyhpbnQgdSwgaW50IHApCgl7CgkJZm9yIChhdXRvIFt2LHddIDogZ1t1XSkKCQkJaWYgKHYgIT0gcCkKCQkJewoJCQkJcGFyW3ZdWzBdID0gdTsKCQkJCWhbdl0gPSBoW3VdKzE7CgkJCQlERlModix1KTsKCQkJfQoJfQoKCXZvaWQgaW5pdCgpIAoJewoJCWxvWzFdID0gMDsKCQlGT1IoaSwyLE4tMTApIGxvW2ldID0gbG9baS8yXSsxOwoJCUZPUihqLDEsbG9bbl0pCgkJCUZPUihpLDEsbikgCgkJCQlwYXJbaV1bal0gPSBwYXJbcGFyW2ldW2otMV1dW2otMV07Cgl9CgoJaW50IExDQShpbnQgeCwgaW50IHkpCgl7CgkJaWYgKGhbeF0gPCBoW3ldKSBzd2FwKHgseSk7CgkJaW50IHogPSBsb1tuXTsKCQlGT0QoaSx6LDApCgkJCWlmIChoW3hdLWhbeV0gPj0gTUFTSyhpKSkgeCA9IHBhclt4XVtpXTsKCQlpZiAoeCA9PSB5KSByZXR1cm4geDsKCQlGT0QoaSx6LDApCgkJCWlmIChwYXJbeF1baV0gIT0gcGFyW3ldW2ldKQoJCQl7CgkJCQl4ID0gcGFyW3hdW2ldOwoJCQkJeSA9IHBhclt5XVtpXTsKCQkJfQoJCXJldHVybiBwYXJbeF1bMF07Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCURGUygxLC0xKTsKCQlpbml0KCk7CgkJdmkgdmVjLHZlYzI7CgkJaW50IHUgPSAxLCB2ID0gbiwgbGNhID0gTENBKHUsdik7CgkJd2hpbGUgKHUgIT0gbGNhKQoJCXsKCQkJdmVjLnBiKHUpOwoJCQl1ID0gcGFyW3VdWzBdOwoJCX0KCQl3aGlsZSAodiAhPSBsY2EpCgkJewoJCQl2ZWMyLnBiKHYpOwoJCQl2ID0gcGFyW3ZdWzBdOwoJCX0KCQl2ZWMyLnBiKGxjYSk7CgkJcmV2ZXJzZShhbGwodmVjMikpOwoJCWZvciAoaW50IHggOiB2ZWMyKSB2ZWMucGIoeCk7CgkJaW50IHByZSA9IDAsIGFucyA9IDA7CgkJRk9SKGksMCxzeih2ZWMpLTIpIAoJCXsKCQkJYW5zICs9IGFicyh2YWxbe3ZlY1tpXSx2ZWNbaSsxXX1dLXByZSk7CgkJCXByZSA9IHZhbFt7dmVjW2ldLHZlY1tpKzFdfV07CgkJfQoJCWNvdXQgPDwgYW5zOwoJfQoKfQoKbmFtZXNwYWNlIHN1YjIgewoKCWludCBkW05dWzExXTsKCglib29sIGFwcHJvdmVkKCkgewoJCUZPUihpLDEsbSkKCQkJaWYgKGVkZ2VbaV1bMl0gPiAxMCkgcmV0dXJuIGZhbHNlOwoJCXJldHVybiB0cnVlOwoJfQoKCXZvaWQgRGlqa3N0cmEoaW50IHApCgl7CgkJRk9SKGksMSxuKSAKCQkJRk9SKGosMSwxMCkgZFtpXVtqXSA9IG9vOwoJCWRbcF1bMF0gPSAwOwoJCXByaW9yaXR5X3F1ZXVlPGFycmF5PGludCwzPix2ZWN0b3I8YXJyYXk8aW50LDM+PixncmVhdGVyPGFycmF5PGludCwzPj4+IHE7CgkJcS5wdXNoKHswLHAsMH0pOwoJCXdoaWxlICghcS5lbXB0eSgpKQoJCXsKCQkJYXV0byBbY29zdCx1LFddID0gcS50b3AoKTsKCQkJcS5wb3AoKTsKCQkJaWYgKGNvc3QgPiBkW3VdW1ddKSBjb250aW51ZTsKCQkJZm9yIChhdXRvIFt2LHddIDogZ1t1XSkKCQkJCWlmIChtaW5pbWl6ZShkW3ZdW3ddLGRbdV1bV10rYWJzKHctVykpKQoJCQkJCXEucHVzaCh7ZFt2XVt3XSx2LHd9KTsKCQl9Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCURpamtzdHJhKDEpOwoJCWludCBhbnMgPSBvbzsKCQlGT1IoaSwxLDEwKSBtaW5pbWl6ZShhbnMsZFtuXVtpXSk7CgkJY291dCA8PCBhbnM7Cgl9CgkKfQoKbmFtZXNwYWNlIHN1YjMgewoKCXVub3JkZXJlZF9tYXA8aW50LGludD4gZDsKCglib29sIGFwcHJvdmVkKCkgewoJCUZPUihpLDEsbSkKCQkJaWYgKGVkZ2VbaV1bMl0gPiAxMCkgcmV0dXJuIGZhbHNlOwoJCXJldHVybiB0cnVlOwoJfQoKCWludCBjb252ZXJ0KGludCB4LCBpbnQgeSkgewoJCXJldHVybiAoeDw8MzFMTCkreTsKCX0KCgl2b2lkIERpamtzdHJhKGludCBwKQoJewoJCWRbY29udmVydChwLDApXSA9IDA7CgkJcHJpb3JpdHlfcXVldWU8YXJyYXk8aW50LDM+LHZlY3RvcjxhcnJheTxpbnQsMz4+LGdyZWF0ZXI8YXJyYXk8aW50LDM+Pj4gcTsKCQlxLnB1c2goezAscCwwfSk7CgkJd2hpbGUgKCFxLmVtcHR5KCkpCgkJewoJCQlhdXRvIFtjb3N0LHUsV10gPSBxLnRvcCgpOwoJCQlxLnBvcCgpOwoJCQlpZiAodSA9PSBuKSAKCQkJewoJCQkJY291dCA8PCBjb3N0OwoJCQkJcmV0dXJuOwoJCQl9CgkJCWlmIChjb3N0ID4gZFtjb252ZXJ0KHUsVyldKSBjb250aW51ZTsKCQkJZm9yIChhdXRvIFt2LHddIDogZ1t1XSkKCQkJCWlmICghZC5jb3VudChjb252ZXJ0KHYsdykpIG9yIG1pbmltaXplKGRbY29udmVydCh2LHcpXSxkW2NvbnZlcnQodSxXKV0rYWJzKHctVykpKQoJCQkJewoJCQkJCWRbY29udmVydCh2LHcpXSA9IGRbY29udmVydCh1LFcpXSthYnMody1XKTsKCQkJCQlxLnB1c2goe2RbY29udmVydCh2LHcpXSx2LHd9KTsKCQkJCX0KCQl9Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCURpamtzdHJhKDEpOwoJfQoJCn0KCm5hbWVzcGFjZSBzdWI0IHsKCgl2aWkgR1tOXTsKCXZpIGFkaltOXTsKCWludCBkW05dOwoKCXZvaWQgRGlqa3N0cmEoaW50IHApCgl7CgkJRk9SKGksMCxtKSBkW2ldID0gb287CgkJZFtwXSA9IDA7CgkJcHJpb3JpdHlfcXVldWU8aWksdmlpLGdyZWF0ZXI8aWk+PiBxOwoJCXEucHVzaCh7MCxwfSk7CgkJd2hpbGUgKCFxLmVtcHR5KCkpCgkJewoJCQlhdXRvIFtjb3N0LHVdID0gcS50b3AoKTsKCQkJcS5wb3AoKTsKCQkJaWYgKGNvc3QgPiBkW3VdKSBjb250aW51ZTsKCQkJZm9yIChhdXRvIFt2LHddIDogR1t1XSkKCQkJCWlmIChtaW5pbWl6ZShkW3ZdLGRbdV0rdykpCgkJCQkJcS5wdXNoKHtkW3ZdLHZ9KTsKCQl9Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCUZPUihpLDEsbSkKCQl7CgkJCWF1dG8gW3Usdix3XSA9IGVkZ2VbaV07CgkJCWFkalt1XS5wYihpKTsgYWRqW3ZdLnBiKGkpOwoJCX0KCQlGT1IoaSwxLG4pCgkJewoJCQlpZiAoc3ooYWRqW2ldKSA8PSAxKSBjb250aW51ZTsKCQkJc29ydChhbGwoYWRqW2ldKSxbJl0oaW50IHgsIGludCB5KSB7CgkJCQlyZXR1cm4gZWRnZVt4XVsyXSA8IGVkZ2VbeV1bMl07CgkJCX0pOwoJCQlGT1IoaiwxLHN6KGFkaltpXSktMSkKCQkJewoJCQkJaW50IHUgPSBhZGpbaV1bai0xXSwgdiA9IGFkaltpXVtqXTsKCQkJCWludCB3ID0gYWJzKGVkZ2VbdV1bMl0tZWRnZVt2XVsyXSk7CgkJCQlHW3VdLnBiKHt2LHd9KTsgR1t2XS5wYih7dSx3fSk7CgkJCX0KCQl9CgkJRk9SKGksMSxtKQoJCQlpZiAoZWRnZVtpXVswXSA9PSAxIG9yIGVkZ2VbaV1bMV0gPT0gMSkKCQkJCUdbMF0ucGIoe2ksZWRnZVtpXVsyXX0pOwoJCURpamtzdHJhKDApOwoJCWludCBhbnMgPSBvbzsKCQlGT1IoaSwxLG0pCgkJCWlmIChlZGdlW2ldWzBdID09IG4gb3IgZWRnZVtpXVsxXSA9PSBuKQoJCQkJbWluaW1pemUoYW5zLGRbaV0pOwoJCWNvdXQgPDwgYW5zOwoJfQoKfQoKYm9vbCBNMjsKc2lnbmVkIG1haW4oKQp7CiAgICBmYXN0OwogICAgaWYgKGZvcGVuKG5hbWUiLmlucCIsInIiKSkKICAgIHsKICAgIAlmcmVvcGVuKG5hbWUiLmlucCIsInIiLHN0ZGluKTsKICAgIAlmcmVvcGVuKG5hbWUiLm91dCIsInciLHN0ZG91dCk7CiAgICB9CiAgICBjaW4gPj4gbiA+PiBtOwogICAgRk9SKGksMSxtKQogICAgewogICAgCWludCB1LHYsdzsKICAgIAljaW4gPj4gdSA+PiB2ID4+IHc7CiAgICAJZ1t1XS5wYih7dix3fSk7IGdbdl0ucGIoe3Usd30pOwogICAgCWVkZ2VbaV0gPSB7dSx2LHd9OwogICAgCXZhbFt7dSx2fV0gPSB2YWxbe3YsdX1dID0gdzsKICAgIH0KICAgIGlmIChzdWIxOjphcHByb3ZlZCgpKSByZXR1cm4gc3ViMTo6c29sdmUoKSwgdGltZSgpLCBtZW1vcnkoKSwgMDsKICAgIGlmIChzdWIyOjphcHByb3ZlZCgpKSByZXR1cm4gc3ViMjo6c29sdmUoKSwgdGltZSgpLCBtZW1vcnkoKSwgMDsKICAgIGlmIChzdWIzOjphcHByb3ZlZCgpKSByZXR1cm4gc3ViMzo6c29sdmUoKSwgdGltZSgpLCBtZW1vcnkoKSwgMDsKICAgIHN1YjQ6OnNvbHZlKCk7CiAgICB0aW1lKCk7CiAgICBtZW1vcnkoKTsKICAgIHJldHVybiAwOwp9Ci8vIOKWiOKWiOKWkSDilojiloggIOKWiCAgICDilojiloggIOKWiOKWiOKWiOKWhCAgICDiloggICDiloTilojilojilojilogKLy/ilpPilojilojilpEg4paI4paI4paSIOKWiOKWiCAg4paT4paI4paI4paSIOKWiOKWiCDiloDiloggICDiloggIOKWiOKWiOKWkiDiloDilojilpIKLy/ilpLilojilojiloDiloDilojilojilpHilpPilojiloggIOKWkuKWiOKWiOKWkeKWk+KWiOKWiCAg4paA4paIIOKWiOKWiOKWkuKWkuKWiOKWiOKWkeKWhOKWhOKWhOKWkQovL+KWkeKWk+KWiCDilpHilojilogg4paT4paT4paIICDilpHilojilojilpHilpPilojilojilpIgIOKWkOKWjOKWiOKWiOKWkuKWkeKWk+KWiCAg4paI4paI4paTCi8v4paR4paT4paI4paS4paR4paI4paI4paT4paS4paS4paI4paI4paI4paI4paI4paTIOKWkuKWiOKWiOKWkSAgIOKWk+KWiOKWiOKWkeKWkeKWkuKWk+KWiOKWiOKWiOKWgOKWkgovLyDilpIg4paR4paR4paS4paR4paS4paR4paS4paT4paSIOKWkiDilpIg4paRIOKWkuKWkSAgIOKWkiDilpIgIOKWkeKWkiAgIOKWkgovLyDilpIg4paR4paS4paRIOKWkeKWkeKWkeKWkuKWkSDilpEg4paRIOKWkSDilpHilpEgICDilpEg4paS4paRICDilpEgICDilpEKLy8g4paRICDilpHilpEg4paRIOKWkeKWkeKWkSDilpEg4paRICAgIOKWkSAgIOKWkSDilpEg4paRIOKWkSAgIOKWkQovLyDilpEgIOKWkSAg4paRICAg4paRICAgICAgICAgICAgICDilpEgICAgICAg4paR