#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
long long e0[505][505];//大路
long long e1[505][505];//小路
long long dis0[505],dis1[505];//出发点
long long vis[505];
int n,m;
void floyd()//预处理小路
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(e1[i][j]>e1[i][k]+e1[k][j]&&e1[i][k]!=INF&&e1[k][j]!=INF)
{
e1[i][j]=e1[i][k]+e1[k][j];
}
}
}
}
}
int main(int argc, char** argv)
{
memset(e0,INF,sizeof(e0));
memset(e1,INF,sizeof(e1));
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
if(a==1&&e1[b][c]>d)
{
e1[b][c]=e1[c][b]=d;
}
else if(a==0&&e0[b][c]>d)
{
e0[b][c]=e0[c][b]=d;
}
}
floyd();
memset(dis0,INF,sizeof(dis0));
memset(dis1,INF,sizeof(dis1));
queue<int> q;
dis0[1]=dis1[1]=0;
q.push(1);
vis[1]=1;
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=0;
for(int i=1;i<=n;i++)
{
long long v=e0[now][i];
if(dis0[i]>dis0[now]+v)//大陆加大陆
{
dis0[i]=dis0[now]+v;
if(vis[i]) continue;
vis[i]=1;
q.push(i);
}
if(dis0[i]>dis1[now]+v) //小路加大路
{
dis0[i]=dis1[now]+v;
if(vis[i]) continue;
vis[i]=1;
q.push(i);
}
if(e1[now][i]<INF)//大陆加小路
{
v=e1[now][i]*e1[now][i];
if(dis1[i]>dis0[now]+v)
{
dis1[i]=dis0[now]+v;
if(vis[i]) continue;
vis[i]=1;
q.push(i);
}
}
}
}
cout<<min(dis0[n],dis1[n])<<endl;
return 0;
}