#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#include<cmath>
#include<algorithm>
using namespace std;
const __int64 inf=1000000000;
typedef struct T{
__int64 big_road;
__int64 small_road;
}Tu;
__int64 big_road;
__int64 small_road;
}Tu;
typedef struct N{
__int64 big_value;
__int64 small_value;
__int64 before_small;
int big_flag;
int small_flag;
}NODE;
__int64 big_value;
__int64 small_value;
__int64 before_small;
int big_flag;
int small_flag;
}NODE;
NODE node[2000];
Tu tu[2000][2000];
Tu tu[2000][2000];
void d(int n)
{
int i,j,min_point,flag;
__int64 min,temp;
for(i=2;i<=n;i++)
{
node[i].big_flag=0;
node[i].small_flag=0;
node[i].big_value=tu[1][i].big_road;
node[i].before_small=tu[1][i].small_road;
if(tu[1][i].small_road!=inf)
node[i].small_value=pow(tu[1][i].small_road,2);
else
node[i].small_value=inf;
}
node[1].big_flag=1;
node[1].small_flag=1;
while(true)
{
min=inf;
flag=-1;
for(j=2;j<=n;j++)
{
if(node[j].big_flag==0&&node[j].big_value<min)
{
min=node[j].big_value;
min_point=j;
flag=0;
}
}
for(j=2;j<=n;j++)
{
if(node[j].small_flag==0&&node[j].small_value<min)
{
min=node[j].small_value;
min_point=j;
flag=1;
}
}
if(flag==-1)break;
if(flag==0)
{
node[min_point].big_flag=1;
for(j=2;j<=n;j++)
{
if(j!=min_point)
{
if(node[j].big_flag==0&&node[min_point].big_value+tu[min_point][j].big_road<node[j].big_value)
node[j].big_value=node[min_point].big_value+tu[min_point][j].big_road;
if(node[j].small_flag==0&&node[min_point].big_value+pow(tu[min_point][j].small_road,2)<node[j].small_value)
{
node[j].small_value=node[min_point].big_value+pow(tu[min_point][j].small_road,2);
node[j].before_small=tu[min_point][j].small_road;
}
}
}
}
else
{
node[min_point].small_flag=1;
for(j=2;j<=n;j++)
{
if(j!=min_point)
{
if(node[j].big_flag==0&&node[min_point].small_value+tu[min_point][j].big_road<node[j].big_value)
node[j].big_value=node[min_point].small_value+tu[min_point][j].big_road;
if(node[j].small_flag==0)
{
temp=node[min_point].small_value-pow(node[min_point].before_small,2)+pow(tu[min_point][j].small_road+node[min_point].before_small,2);
if(temp<node[j].small_value)
{
node[j].small_value=temp;
node[j].before_small=tu[min_point][j].small_road+node[min_point].before_small;
}
}
}
}
}
}
{
int i,j,min_point,flag;
__int64 min,temp;
for(i=2;i<=n;i++)
{
node[i].big_flag=0;
node[i].small_flag=0;
node[i].big_value=tu[1][i].big_road;
node[i].before_small=tu[1][i].small_road;
if(tu[1][i].small_road!=inf)
node[i].small_value=pow(tu[1][i].small_road,2);
else
node[i].small_value=inf;
}
node[1].big_flag=1;
node[1].small_flag=1;
while(true)
{
min=inf;
flag=-1;
for(j=2;j<=n;j++)
{
if(node[j].big_flag==0&&node[j].big_value<min)
{
min=node[j].big_value;
min_point=j;
flag=0;
}
}
for(j=2;j<=n;j++)
{
if(node[j].small_flag==0&&node[j].small_value<min)
{
min=node[j].small_value;
min_point=j;
flag=1;
}
}
if(flag==-1)break;
if(flag==0)
{
node[min_point].big_flag=1;
for(j=2;j<=n;j++)
{
if(j!=min_point)
{
if(node[j].big_flag==0&&node[min_point].big_value+tu[min_point][j].big_road<node[j].big_value)
node[j].big_value=node[min_point].big_value+tu[min_point][j].big_road;
if(node[j].small_flag==0&&node[min_point].big_value+pow(tu[min_point][j].small_road,2)<node[j].small_value)
{
node[j].small_value=node[min_point].big_value+pow(tu[min_point][j].small_road,2);
node[j].before_small=tu[min_point][j].small_road;
}
}
}
}
else
{
node[min_point].small_flag=1;
for(j=2;j<=n;j++)
{
if(j!=min_point)
{
if(node[j].big_flag==0&&node[min_point].small_value+tu[min_point][j].big_road<node[j].big_value)
node[j].big_value=node[min_point].small_value+tu[min_point][j].big_road;
if(node[j].small_flag==0)
{
temp=node[min_point].small_value-pow(node[min_point].before_small,2)+pow(tu[min_point][j].small_road+node[min_point].before_small,2);
if(temp<node[j].small_value)
{
node[j].small_value=temp;
node[j].before_small=tu[min_point][j].small_road+node[min_point].before_small;
}
}
}
}
}
}
}
__int64 min(__int64 value1, __int64 value2)
{
__int64 hh=(value1 <= value2?value1 : value2);
return hh;
}
{
__int64 hh=(value1 <= value2?value1 : value2);
return hh;
}
int main()
{
int n,m,i,j,t,a,b,v;;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
tu[i][j].small_road=inf;
tu[i][j].big_road=inf;
}
}
for(i=1;i<=m;i++)
{
cin>>t>>a>>b>>v;
if(t==0)
tu[a][b].big_road=tu[b][a].big_road=v;
else
tu[a][b].small_road=tu[b][a].small_road=v;
}
d(n);
printf("%I64u\n",min(node[n].big_value,node[n].small_value));
return 0;
}
{
int n,m,i,j,t,a,b,v;;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
tu[i][j].small_road=inf;
tu[i][j].big_road=inf;
}
}
for(i=1;i<=m;i++)
{
cin>>t>>a>>b>>v;
if(t==0)
tu[a][b].big_road=tu[b][a].big_road=v;
else
tu[a][b].small_road=tu[b][a].small_road=v;
}
d(n);
printf("%I64u\n",min(node[n].big_value,node[n].small_value));
return 0;
}