/*
* @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