/*
TASK:tri
LANG:C++
*/
#include <iostream>
using namespace std;
bool graph[2000][2000], used[2000];
int n, m, k, l, p=0, first, sec, lsum=3200;
void DFS(int j)
 {
  used[j]=true;
  p++;
  if(p==1) first=j;
  else if(p==2) sec=j;
  else if(p==3) {  if(graph[j][first] && graph[first][sec] && graph[sec][j] && first+sec+j<lsum && first!=sec && sec!=j && first!=j) { lsum=first+sec+j;  } p=0; }
  for(int i=1; i<=n; i++)
   {
    if(!used[i] && graph[j][i]) DFS(i);
   }
  used[j]=false;
 }  
int main()
 {
  cin>>n>>m;
  for(int i=1; i<=m; i++)
   {
    cin>>k>>l;
    graph[k][l]=graph[l][k]=true;
   }
  for(int i=1; i<=n; i++)
   {
    if(!used[i]) { DFS(i); }
   }
  if(lsum!=3200) cout<<lsum<<endl;
  else cout<<0<<endl;
  return 0;
 }
